bingxuan9112

pattern

Apr 12th, 2020
360
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.74 KB | None | 0 0
  1. #include <cstdio>
  2. typedef long long ll;
  3. const int N = 500001, inf = 1e9;
  4. struct Segtree {
  5.     struct node {
  6.         int mn, cnt;
  7.         //node(int mn = 0, int cnt = 1) : mn(mn), cnt(cnt) {}
  8.         friend node operator+(const node &a, const node &b) {
  9.             if(a.mn != b.mn) return a.mn < b.mn ? a : b;
  10.             return {a.mn, a.cnt+b.cnt};
  11.         }
  12.     } st[N<<1];
  13.     int n, lz[N];
  14.     void init(int _n) {
  15.         n = _n;
  16.         for(int i = 0; i < n; i++) st[i+n] = {inf, 1}, lz[i] = 0;
  17.         for(int i = n-1; i > 0; i--) st[i] = st[i<<1]+st[i<<1|1];
  18.     }
  19.     void upd(int p, int d) {
  20.         st[p].mn += d;
  21.         if(p < n) lz[p] += d;
  22.     }
  23.     void pull(int p) {
  24.         for(; p>1; p>>=1) {
  25.             st[p>>1] = st[p]+st[p^1];
  26.             st[p>>1].mn += lz[p>>1];
  27.         }
  28.     }
  29.     void add(int l, int r, int d) {
  30.         if(l == r) return;
  31.         int L = l, R = r;
  32.         for(l+=n,r+=n; l<r; l>>=1,r>>=1) {
  33.             if(l&1) upd(l++, d);
  34.             if(r&1) upd(--r, d);
  35.         }
  36.         pull(L+n), pull(R-1+n);
  37.     }
  38. } sgt;
  39. int n, v[N], pos[N], d[N];
  40. void solve() {
  41.     scanf("%d", &n);
  42.     for(int i = 1; i <= n; i++) scanf("%d", v+i);
  43.     for(int i = 1; i <= n; i++) pos[--v[i]] = i;
  44.     v[0] = v[n+1] = n;
  45.     sgt.init(n);
  46.     ll ans = 0;
  47.     for(int i = n-1; i >= 0; i--) {
  48.         int p = pos[i];
  49.         int a = v[p-1]>i ? v[p-1] : n;
  50.         int b = v[p+1]>i ? v[p+1] : n;
  51.         sgt.add(i, n, -1);
  52.         sgt.add(i, a, 1);
  53.         sgt.add(i, b, 1);
  54.         sgt.add(i, i+1, -inf);
  55.         ans += sgt.st[1].cnt;
  56.     }
  57.     printf("%lld\n", ans);
  58. }
  59. signed main() {
  60.     //ios_base::sync_with_stdio(0), cin.tie(0);
  61.     int t;
  62.     scanf("%d", &t);
  63.     while(t--)
  64.         solve();
  65. }
Advertisement
Add Comment
Please, Sign In to add comment