Advertisement
Guest User

Untitled

a guest
Aug 18th, 2020
268
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. struct SegTree {
  6.   struct Node {
  7.     long long sum, minp;
  8.     int freq;
  9.   };
  10.   vector<int> v;
  11.   int n;
  12.   vector<Node> T;
  13.  
  14.   SegTree(vector<int> v) : v(v), n(v.size()), T(4 * n) {
  15.     init(1, 0, n - 1);
  16.   }
  17.  
  18.   void pull(int node) {
  19.     Node l = T[2 * node], r = T[2 * node + 1];
  20.     T[node].sum = l.sum + r.sum;
  21.     if (l.minp < l.sum + r.minp) {
  22.       T[node].minp = l.minp;
  23.       T[node].freq = l.freq;
  24.     } else if (l.minp > l.sum + r.minp) {
  25.       T[node].minp = r.minp + l.sum;
  26.       T[node].freq = r.freq;
  27.     } else {
  28.       T[node].minp = l.minp;
  29.       T[node].freq = l.freq + r.freq;
  30.     }
  31.   }
  32.  
  33.   void init(int node, int b, int e) {
  34.     if (b == e) T[node] = Node{v[b] - b, v[b] - b, 1};
  35.     else {
  36.       int m = (b + e) / 2;
  37.       init(node * 2, b, m);
  38.       init(node * 2 + 1, m + 1, e);
  39.       pull(node);
  40.     }
  41.   };
  42.  
  43.   void upd(int node, int b, int e, int l, int r) {
  44.     if (e < l) return;
  45.     if (b > r) return;
  46.     if (b > l && e < r) return;
  47.     if (b == e) {
  48.       assert(b == l || b == r);
  49.       T[node] = Node{v[b] - b, v[b] - b, 1};
  50.       return;
  51.     }
  52.     int m = (b + e) / 2;
  53.     upd(node * 2, b, m, l, r);
  54.     upd(node * 2 + 1, m + 1, e, l, r);
  55.     pull(node);
  56.   }
  57.  
  58.   void Swap(int a, int b) {
  59.     if (a > b) swap(a, b);
  60.     swap(v[a], v[b]);
  61.     upd(1, 0, n - 1, a, b);
  62.   }
  63.  
  64.   int Get() {
  65.     assert(T[1].minp == 0);
  66.     return T[1].freq;
  67.   }
  68. };
  69.  
  70. struct Brut {
  71.   vector<int> v;
  72.  
  73.   Brut(vector<int> v) : v(v) {}
  74.  
  75.   int Get() {
  76.     int minn = v[0], maxx = v[0], ans = 0;
  77.     for (int i = 0; i < (int)v.size(); ++i) {
  78.       minn = min(minn, v[i]);
  79.       maxx = max(maxx, v[i]);
  80.       if (minn == 0 && maxx == i) {
  81.         ans += 1;
  82.       }
  83.     }
  84.     return ans;
  85.   }
  86.  
  87.   void Swap(int a, int b) { swap(v[a], v[b]); }
  88. };
  89.  
  90. int main() {
  91.   int n = 20;
  92.   vector<int> v(n);
  93.   for (int i = 0; i < n; ++i)
  94.     v[i] = i;
  95.   SegTree st(v); Brut brut(v);
  96.   for (int ops = 1;; ++ops) {
  97.     int a = rand() % n, b = rand() % n;
  98.     if (a == b) { --ops; continue; }
  99.     st.Swap(a, b);
  100.     brut.Swap(a, b);
  101.     if (st.Get() != brut.Get()) {
  102.       for (int i = 0; i < n; ++i)
  103.         cerr << brut.v[i] << " "; cerr << endl;
  104.       cerr << brut.Get() << " " << st.Get() << endl;
  105.       return -1;
  106.     }
  107.     assert(st.Get() == brut.Get());
  108.     if (ops % 1000 == 0) cerr << "OK " << ops << endl;
  109.   }
  110. }
  111.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement