Untitled
unknown
c_cpp
9 months ago
2.6 kB
6
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