Advertisement
vlatkovski

usaco piepie fail

Feb 29th, 2020
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1.  
  2. // Problem : Problem 1. A Pie for a Pie
  3. // Contest : USACO 2017 December Contest, Gold
  4. // URL : http://usaco.org/index.php?page=viewproblem2&cpid=765
  5. // Memory Limit : 256 MB
  6. // Time Limit : 4000 ms
  7. // Powered by CP Editor (https://github.com/cpeditor/cp-editor)
  8.  
  9. #include <bits/stdc++.h>
  10. using namespace std;
  11. typedef long long ll;
  12. typedef pair<int, int> pii;
  13.  
  14. const int N = 100100;
  15. const int BASE = 1<<17;
  16. const int inf = 1e9 + 10;
  17.  
  18. int n, D;
  19. int data[2][2][N];
  20. int order[2][N];
  21. int invorder[2][N];
  22. int ans[2][N];
  23.  
  24. struct segtree {
  25.     struct Node {
  26.         int dist, node, lazy;
  27.         bool disabled;
  28.         Node() {
  29.             dist = lazy = inf;
  30.             node = -1;
  31.             disabled = false;
  32.         }
  33.         inline void merge(Node& l, Node& r) {
  34.             disabled = false;
  35.             if (l.disabled && r.disabled) {
  36.                 dist = inf, node = -1;
  37.                 disabled = true;
  38.             } else if (l.disabled) {
  39.                 dist = r.dist, node = r.node;
  40.             } else if (r.disabled) {
  41.                 dist = l.dist, node = l.node;
  42.             } else if (l.dist < r.dist) {
  43.                 dist = l.dist, node = l.node;
  44.             } else {
  45.                 dist = r.dist, node = r.node;
  46.             }
  47.         }
  48.         inline void push(Node& l, Node& r) {
  49.             l.receive(lazy);
  50.             r.receive(lazy);
  51.             lazy = inf;
  52.         }
  53.         inline void receive(int lz) {
  54.             if (!disabled) {
  55.                 dist = min(dist, lz);
  56.                 lazy = min(lazy, lz);
  57.             }
  58.         }
  59.     };
  60.     Node tree[2*BASE];
  61.     void build(int v, int tl, int tr) {
  62.         if (tl == tr) {
  63.             tree[v].dist = inf;
  64.             tree[v].node = tl;
  65.         } else {
  66.             int tm = (tl + tr) / 2;
  67.             build(2*v, tl, tm);
  68.             build(2*v+1, tm+1, tr);
  69.             tree[v].merge(tree[2*v], tree[2*v+1]);
  70.         }
  71.     }
  72.     void update(int v, int tl, int tr, int l, int r, int val) {
  73.         if (l > r || tree[v].disabled) return;
  74.         if (l == tl && tr == r) {
  75.             tree[v].receive(val);
  76.             return;
  77.         }
  78.         tree[v].push(tree[2*v], tree[2*v+1]);
  79.         int tm = (tl + tr) / 2;
  80.         update(2*v, tl, tm, l, min(r, tm), val);
  81.         update(2*v+1, tm+1, tr, max(l, tm+1), r, val);
  82.         tree[v].merge(tree[2*v], tree[2*v+1]);
  83.     }
  84.     void disable(int v, int tl, int tr, int pos) {
  85.         if (tl == tr) {
  86.             tree[v].disabled = true;
  87.             return;
  88.         }
  89.         tree[v].push(tree[2*v], tree[2*v+1]);
  90.         int tm = (tl + tr) / 2;
  91.         if (pos <= tm) {
  92.             disable(2*v, tl, tm, pos);
  93.         } else {
  94.             disable(2*v+1, tm+1, tr, pos);
  95.         }
  96.         tree[v].merge(tree[2*v], tree[2*v+1]);
  97.     }
  98. } tree[2];
  99.  
  100. int main() {
  101.     ios::sync_with_stdio(false);
  102.     cin.tie(0);
  103.     #ifndef _DEBUG
  104.     freopen("piepie.in", "r", stdin);
  105.     freopen("piepie.out", "w", stdout);
  106.     #endif
  107.     cin >> n >> D;
  108.     for (int k = 0; k < 2; ++k) {
  109.         tree[k].build(1, 0, n-1);
  110.     }
  111.     for (int k = 0; k < 2; ++k) {
  112.         for (int i = 0; i < n; ++i) {
  113.             for (int j = 0; j < 2; ++j) {
  114.                 cin >> data[k][j][i];
  115.             }
  116.             ans[k][i] = inf;
  117.             order[k][i] = i;
  118.         }
  119.         sort(order[k], order[k]+n, [&] (int i, int j) {
  120.             return data[k][k][i] < data[k][k][j];
  121.         });
  122.         for (int i = 0; i < n; ++i) {
  123.             int u = order[k][i];
  124.             invorder[k][u] = i;
  125.             if (data[k][1-k][u] == 0) {
  126.                 tree[k].update(1, 0, n-1, i, i, 0);
  127.             }
  128.         }
  129.     }
  130.     /*
  131.     for (int k = 0; k < 2; ++k) {
  132.         for (int i = 0; i < n; ++i) {
  133.             for (int j = 0; j < 2; ++j) {
  134.                 cout << "data["<<k<<"]["<<j<<"]["<<i<<"] = "<<data[k][j][i]<<"\n";
  135.             }
  136.         }
  137.     }
  138.     */
  139.     while (true) {
  140.         int k = -1, i = -1, dist = inf;
  141.         for (int k1 = 0; k1 < 2; ++k1) {
  142.             if (tree[k1].tree[1].disabled) continue;
  143.             int i1 = tree[k1].tree[1].node;
  144.             int dist1 = tree[k1].tree[1].dist;
  145.             if (dist1 < dist) {
  146.                 k = k1;
  147.                 i = i1;
  148.                 dist = dist1;
  149.             }
  150.         }
  151.         if (dist == inf) break;
  152.         tree[k].disable(1, 0, n-1, i);
  153.         int u = order[k][i];
  154.         ans[k][u] = dist;
  155.         int x = data[k][1-k][u];
  156.         int l = n, r = -1;
  157.         int lo, hi, mid;
  158.         lo = 0, hi = n-1;
  159.         while (lo <= hi) {
  160.             mid = (lo + hi) / 2;
  161.             int v = order[1-k][mid];
  162.             if (data[1-k][1-k][v] >= x - D) {
  163.                 l = mid;
  164.                 hi = mid-1;
  165.             } else {
  166.                 lo = mid+1;
  167.             }
  168.         }
  169.         lo = 0, hi = n-1;
  170.         while (lo <= hi) {
  171.             mid = (lo + hi) / 2;
  172.             int v = order[1-k][mid];
  173.             if (data[1-k][1-k][v] <= x) {
  174.                 r = mid;
  175.                 lo = mid+1;
  176.             } else {
  177.                 hi = mid-1;
  178.             }
  179.         }
  180.         //cout << "k="<<k<<" i="<<i<<" d="<<dist<<" u="<<u<<" x="<<x<<" l="<<l<<" r="<<r<<"\n";
  181.         if (l <= r) {
  182.             tree[1-k].update(1, 0, n-1, l, r, dist+1);
  183.         }
  184.     }
  185.     for (int i = 0; i < n; ++i) {
  186.         if (ans[0][i] >= inf) {
  187.             cout << -1 << '\n';
  188.         } else {
  189.             cout << ans[0][i]+1 << '\n';
  190.         }
  191.     }
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement