Untitled

 avatar
unknown
c_cpp
15 days ago
2.6 kB
2
Indexable
#include <bits/stdc++.h>
using namespace std;
#define fastio() ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
#define LSB(i) ((i) & (-i))
#define ll long long
const int dx[]{-1,1,0,0,-1,-1,1,1};
const int dy[]{0,0,1,-1,-1,1,-1,1};
const int MOD = 1e9+7;
#define int ll


const int N = 3e5+5;

struct Node {
    int val, lazy;
} tree[4*N];

Node mrg(Node a, Node b){
    return {a.val+b.val, 0};
}

void push(int node, int l, int r){
    if(tree[node].lazy && l != r){
        int mid = (l+r) >> 1;
        tree[node<<1].val += (mid-l+1)*tree[node].lazy;
        tree[node<<1].lazy += tree[node].lazy;
        tree[node<<1|1].val += (r-mid)*tree[node].lazy;
        tree[node<<1|1].lazy += tree[node].lazy;
        tree[node].lazy = 0;
    }
}
void update(int node, int l, int r, int ql, int qr, int x){
    push(node, l, r);
    if(ql <= l && r <= qr){
        tree[node].val += (r-l+1)*x;
        tree[node].lazy += x;
        return;
    }
    int mid = (l+r) >> 1;
    if(qr <= mid) update(node<<1, l, mid, ql, qr, x);
    else if(ql > mid) update(node<<1|1, mid+1, r, ql, qr, x);
    else {
        update(node<<1, l, mid, ql, qr, x);
        update(node<<1|1, mid+1, r, ql, qr, x);
    }
    tree[node] = mrg(tree[node<<1], tree[node<<1|1]);
}

Node qry(int node, int l, int r, int ql, int qr){
    push(node, l, r);
    if(ql <= l && r <= qr) return tree[node];
    int mid = (l+r) >> 1;
    if(qr <= mid) return qry(node<<1, l, mid, ql, qr);
    else if(ql > mid) return qry(node<<1|1, mid+1, r, ql, qr);
    return mrg(qry(node<<1, l, mid, ql, qr), qry(node<<1|1, mid+1, r, ql, qr));
}
void solve(int testCase)  {
    int n;
    cin >> n;
    std::vector<int> v(n);
    for(int& x : v)  cin >> x;
    map<int, int> mp;
    int ans = 0;
    for(int i = 0; i < n; ++i){
        int prev = mp.count(v[i]-1) ? mp[v[i]-1] : -1;
        int same = mp.count(v[i]) ? mp[v[i]] : -1;
        int next = mp.count(v[i]+1) ? mp[v[i]+1] : -1;
        if(prev != -1 && next != -1 && same < min(prev, next)){
            update(1, 0, n-1, max(prev, next)+1, i, 1);
            update(1, 0, n-1, same+1, min(prev, next), -1);
        } else {
            update(1, 0, n-1, max({same, prev, next})+1, i, 1);
        }
        int x = qry(1, 0, n-1, 0, i).val;
        ans += x;
        mp[v[i]] = i;
    }
    cout << ans;
} 

int32_t main(){
    fastio();  
    int t = 1;
  //   cin >> t;
    for(int i = 1; i <= t; ++i){
        solve(i);
    }
    return 0;
}
Editor is loading...
Leave a Comment