Advertisement
Kevin_Zhang

Untitled

Jul 17th, 2020
374
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.85 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. #define pb emplace_back
  3. using namespace std;
  4. using ll = long long;
  5. const int maxn = 100010;
  6. int x[maxn], y[maxn], L, n;
  7. ll res;
  8. void upsd() {
  9.     for (int i = 0;i < n;++i)
  10.         x[i] = L - x[i] - 1;
  11. }
  12. struct sgt {
  13.     int mn[maxn<<1], sec[maxn<<1], tag[maxn<<1];
  14.     ll sum[maxn<<1], mncnt[maxn<<1];
  15.     void push(int i) {
  16.         if (i < n && tag[i]) {
  17.             node_chmx(i<<1, tag[i]);
  18.             node_chmx(i<<1|1, tag[i]);
  19.             tag[i] = 0;
  20.         }
  21.     }
  22.     void node_chmx(int i, int val) {
  23.         if (i > n+n || mn[i] >= val) return;
  24.         if (val < sec[i]) {
  25.             sum[i] += mncnt[i] * (val - mn[i]);
  26.             mn[i] = val;
  27.             tag[i] = val;
  28.             return;
  29.         }
  30.         tag[i] = max(tag[i], val);
  31.         push(i);
  32.         update(i);
  33.     }
  34.     void update(int i) {
  35.         if (i >= n) return;
  36.         push(i);
  37.         sum[i] = sum[i<<1] + sum[i<<1|1];
  38.         mn[i] = min(mn[i<<1], mn[i<<1|1]), sec[i] = INT_MAX;
  39.         mncnt[i] = (mn[i] == mn[i<<1] ? mncnt[i<<1] : 0) + (mn[i] == mn[i<<1|1] ? mncnt[i<<1|1] : 0);
  40.         for (int v : {mn[i], mn[i<<1|1], sec[i], sec[i<<1|1]})
  41.             if (v > mn[i]) sec[i] = min(sec[i], v);
  42.         if (sec[i] == INT_MAX) sec[i] = mn[i];
  43.     }
  44.     void init() {
  45.         for (int i = 0;i < n;++i) {
  46.             sum[i+n] = mn[i+n] = sec[i+n] = i;
  47.             mncnt[i+n] = 1;
  48.         }
  49.         for (int i = n-1;i > 0;--i)
  50.             update(i);
  51.     }
  52.     void pa(int v) {
  53.         for (int i = 18;i > 0;--i)
  54.             push(v>>i);
  55.     }
  56.     ll getsum(int l, int r) {
  57.         l += n, r += n;
  58.         pa(l), pa(r);
  59.         ll res = 0;
  60.         for (;l < r;l>>=1, r>>=1) {
  61.             if (l&1) res += sum[l++];
  62.             if (r&1) res += sum[--r];
  63.         }
  64.         return res;
  65.     }
  66.     void modify(int i, int v) {
  67.         i += n;
  68.         pa(i);
  69.         sum[i] = mn[i] = sec[i] = v;
  70.         mncnt[i] = 1;
  71.         for (;i>>=1;)
  72.             update(i);
  73.     }
  74.     void chmx(int l, int r, int v) {
  75.         l += n, r += n;
  76.         int sl = l>>1, sr = r>>1;
  77.         for (;l < r;l>>=1, r>>=1) {
  78.             if (l&1) node_chmx(l++, v);
  79.             if (r&1) node_chmx(--r, v);
  80.         }
  81.         for (;sl;sl>>=1, sr>>=1)
  82.             update(sl), update(sr);
  83.     }
  84. }tree;
  85.            
  86. void solve() {
  87.     vector<vector<int>> mp(L);
  88.     vector<int> vis(L);
  89.     for (int i = 0;i < n;++i)
  90.         mp[x[i]].pb(y[i]);
  91.     ll sum = (n-1) * n / 2;
  92.     ll old = res;
  93.     tree.init();
  94.     cerr << "GS 0 " << tree.getsum(0, n) << '\n';
  95.     cerr << "Sum " << sum << '\n';
  96.     for (int i = 0;i < L;++i, res += sum) {
  97.         for (int u : mp[i]) {
  98.             tree.chmx(u+1, n, u-1);
  99.             tree.modify(u, -1);
  100.         }
  101.         cerr << "getsum at " << i << ' ' << tree.getsum(0, n) << '\n';
  102.         res += sum - tree.getsum(0, n);
  103.         cerr << "Add " << sum - tree.getsum(0, n) << '\n';
  104.     }
  105.  
  106.     cerr << res -old<< '\n';
  107.     exit(0);
  108.     for (int i = 0;i < L;++i) {
  109.         auto &v = mp[i];
  110.         if (v.size()) res -= L - v.size();//, cerr << " - " << n-v.size() << '\n';
  111.     }
  112.     res -= n;
  113. }
  114.  
  115. signed main(){
  116.     ios_base::sync_with_stdio(0), cin.tie(0);
  117.     cin >> L >> n;;
  118.     for (int i = 0;i < n;++i)
  119.         cin >> x[i] >> y[i];
  120.     solve();
  121.     upsd();
  122.     solve();
  123.     for (int i = 0;i < n;++i)
  124.         y[i] = L - y[i] - 1;
  125.     solve();
  126.     upsd();
  127.     solve();
  128.     cout << res << '\n';
  129. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement