jainbot27

Untitled

Aug 26th, 2020
249
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.33 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define int long long
  4. using ll = long long;
  5. #define f first
  6. #define s second
  7. using node = int;
  8.  
  9. struct segtree{
  10.     int size;
  11.     vector<node> vals;
  12.     node ne = 0; //a neutral element
  13.  
  14.     node comb(node a, node b){
  15.         return max(a, b);
  16.     }
  17.  
  18.     void init(int n){
  19.         size = 1;
  20.         while(size < n){
  21.             size *= 2;
  22.         }
  23.         vals.assign(2 * size, ne);
  24.     }
  25.  
  26.     void build(vector<node>& a, int x, int lx, int rx){ //build in O(N)
  27.         if(rx - lx == 1){
  28.             if(lx < a.size()){
  29.                 vals[x] = a[lx];
  30.             }
  31.             return;
  32.         }
  33.         int m = (lx + rx)/2;
  34.         build(a, 2 * x + 1, lx, m);
  35.         build(a, 2 * x + 2, m, rx);
  36.         vals[x] = comb(vals[2 * x + 1],vals[2 * x + 2]);
  37.     }
  38.  
  39.     void build(vector<node>&a){
  40.         build(a, 0, 0, size);  
  41.     }
  42.  
  43.     void update(int i, node v, int x, int lx, int rx){
  44.         if(rx - lx == 1){
  45.             vals[x] = v;
  46.             return;
  47.         }
  48.         int m = (lx + rx)/2;
  49.         if(i < m)
  50.             update(i, v, 2 * x + 1, lx, m);
  51.         else
  52.             update(i, v, 2 * x + 2, m, rx);
  53.         vals[x] = comb(vals[2 * x + 1], vals[2 * x + 2]);
  54.     }
  55.  
  56.     void update(int i, node v){
  57.         update(i, v, 0, 0, size);
  58.     }
  59.  
  60.     node query(int l, int r, int x, int lx, int rx){//query the range of [l to r-1]
  61.         if(lx >= r || l >= rx)
  62.             return ne;
  63.         if(lx >= l && rx <= r){
  64.             return vals[x];
  65.         }
  66.         int m = (lx + rx)/2;
  67.         node s1 = query(l, r, 2 * x + 1, lx, m);
  68.         node s2 = query(l, r, 2 * x + 2, m, rx);
  69.         return comb(s1, s2);
  70.     }
  71.  
  72.     node query(int l, int r){
  73.         return query(l, r, 0, 0, size);
  74.     }
  75. }st;
  76.  
  77. const int mxP = 1e5 + 10;
  78. int n, p, yy[mxP], sp[mxP];
  79. pair<int, int> e[mxP];
  80. array<int, 4> a[mxP];
  81. bool cmp(int e1, int  e2){
  82.     if(a[e1][3] == a[e2][3])
  83.         return a[e1][2] < a[e2][2];
  84.     return a[e1][3] < a[e2][3];
  85. }
  86. bool cmp2(array<int, 4> e1, array<int, 4> e2){
  87.     if(e1[2] == e2[2])
  88.         return e1[3] < e2[3];
  89.     return e1[2] < e2[2];
  90. }
  91. signed main(){
  92.     ios_base::sync_with_stdio(0); cin.tie(0);
  93.     //freopen("boards.in", "r", stdin); freopen("boards.out", "w", stdout);
  94.     cin >> n >> p;
  95.     st.init(p);
  96.     for(int i=0; i < p; i++){
  97.         for(int j=0;j < 4; j++)
  98.             cin >> a[i][j];
  99.         yy[i] = i;
  100.         e[i] = {a[i][3], a[i][2]};
  101.     }
  102.     sort(a, a+p, cmp2);
  103.     sort(yy,yy+p,cmp);
  104.     sort(e, e+p);
  105.     for(int i = 0; i < p; i++){
  106.         sp[yy[i]] = i;
  107.     }
  108.     //for(int i=0; i < p; i++){
  109.         //cerr << e[i].f << " " << e[i].s << "\n";
  110.     //}
  111.     for(int i=0;i<p; i++){
  112.         int bx = a[i][2], by = a[i][3];
  113.         int ax = a[i][0], ay = a[i][1];
  114.         int pos = upper_bound(e, e + p, (pair<int, int>){ay, (ll)1e9}) - e;
  115.         int sv = st.query(0, pos);
  116.         //cerr << i << " " << bx << " " << by << " " << ax << " " << ay << " " << pos << " " << sv << "\n";
  117.         //assert(sp[i]>=pos);
  118.         if(sv >= 2 * n) assert(false); //CODE IS FAILING THIS ASSERT ON TEST CASES
  119.         //assert(bx + by - (ay + ax - sv) >= 0);
  120.         st.update(sp[i], bx + by - (ay + ax - sv));
  121.     }
  122.     //cerr << st.query(0, p) << "\n";
  123.     cout << 2 * n - st.query(0, p) << "\n";
  124. }
  125.  
Advertisement
Add Comment
Please, Sign In to add comment