Untitled
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