Advertisement
Malinovsky239

Untitled

Nov 12th, 2011
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.12 KB | None | 0 0
  1. #include <cstdio>
  2. #include <iostream>
  3. #include <algorithm>
  4.  
  5. using namespace std;
  6.  
  7. #define N int(5e4 + 5)
  8.  
  9. struct point {
  10.     int x, y, dir, num;
  11.  
  12.     void read(int a) {
  13.         num = a;
  14.         char c;
  15.         scanf("%d %d %c", &x, &y, &c);
  16.         switch (c) {
  17.             case 'S': dir = 0; break;
  18.             case 'W': dir = 3; break;
  19.             case 'N': dir = 2; break;
  20.             case 'E': dir = 1; break;
  21.         }
  22.     }
  23.  
  24.     void rot() {
  25.         int nx = -y;
  26.         y = x;
  27.         x = nx;
  28.         dir = (dir + 1) % 4;
  29.     }
  30. };
  31.  
  32.  
  33. point p[N];
  34. int res[N];
  35.  
  36. bool operator < (point a, point b) {
  37.     if (a.x + a.y == b.x + b.y)
  38.         return (a.y - a.x < b.y - b.x);
  39.     return (a.x + a.y < b.x + b.y);
  40. }
  41.  
  42. struct two {
  43.     int l, r;
  44.  
  45.     two() {}
  46.  
  47.     two (int a, int b) {
  48.         l = a, r = b;
  49.     }
  50. };
  51.  
  52. struct treap {
  53.     int x, y, sum, l, r, val;
  54.  
  55.     treap() {}
  56.  
  57.     treap(int a, int b, int c) {
  58.         x = a, y = b, sum = c;
  59.         sum = 1;       
  60.         l = r = 0;
  61.         val = 1;
  62.     }
  63. };
  64.  
  65. treap t[N];
  66. int root, num;
  67.  
  68. void update(int v) {
  69.     if (!v) return;
  70.     t[v].sum = t[ t[v].l ].sum + t[ t[v].r ].sum + t[v].val;
  71. }
  72.  
  73. int merge(int l, int r) {
  74.     if (!l || !r)
  75.         return l + r;
  76.     if (t[l].y < t[r].y) {
  77.         t[r].l = merge(l, t[r].l);
  78.         update(r);
  79.         return r;
  80.     }          
  81.     else {
  82.         t[l].r = merge(t[l].r, r);
  83.         update(l);
  84.         return l;
  85.     }
  86. }
  87.  
  88. two split(int v, int x) {
  89.     if (!v) return two(0, 0);
  90.  
  91.     if (t[v].x <= x) {
  92.         two res = split(t[v].r, x);
  93.         t[v].r = res.l;
  94.         update(v);
  95.         return two(v, res.r);
  96.     }
  97.     else {
  98.         two res = split(t[v].l, x);
  99.         t[v].l = res.r;
  100.         update(v);
  101.         return two(res.l, v);
  102.     }
  103. }
  104.  
  105. bool find(int v, int x) {
  106.     if (!v) return false;
  107.     if (t[v].x == x) {
  108.         t[v].val++;
  109.         update(v);
  110.         return true;
  111.     }
  112.     if (t[v].x < x) {
  113.         bool ret = find(t[v].r, x);
  114.         update(v);
  115.         return ret;
  116.     }
  117.     else {
  118.         bool ret = find(t[v].l, x);
  119.         update(v);
  120.         return ret;
  121.     }
  122. }
  123.  
  124. void draw(int v, int h) {
  125.     if (!v) return;
  126.     draw(t[v].r, h + 1);
  127.     fprintf(stdout, "%*d/%d\n", 4 * h, t[v].sum, t[v].x);
  128.     draw(t[v].l, h + 1);
  129. }
  130.  
  131. void insert(int x) {
  132.     if (!find(root, x)) {
  133.         two res = split(root, x);      
  134.         t[++num] = treap(x, rand() * RAND_MAX + rand(), 0);
  135.         root = merge(res.l, num);
  136.         root = merge(root, res.r);
  137.     }
  138. }
  139.  
  140. int sum(int r) {
  141.     /*cout << "r = " << r << endl;
  142.     draw(root, 0);
  143.     cout << "---------------\n";
  144.     draw(res.l, 0);
  145.     cout << "---------------\n";
  146.     draw(res.r, 0);
  147.     cout << "---------------\n";*/
  148.     two res = split(root, r);  
  149.     int mem = t[res.l].sum;
  150.     root = merge(res.l, res.r);
  151.     return mem;
  152. }
  153.  
  154. int main() {
  155.     freopen("sentinels.in", "r", stdin);
  156.     freopen("sentinels.out", "w", stdout);
  157.  
  158.     int n;
  159.     scanf("%d ", &n);
  160.    
  161.     for(int i = 0; i < n; i++)
  162.         p[i].read(i);              
  163.      
  164.     for (int i = 0; i < 4; i++) {
  165.         root = 0;
  166.         num = 0;
  167.         sort(p, p + n);
  168.  
  169. /*      for (int j = 0; j < n; j++) {
  170.             cout << p[j].x << " " << p[j].y << " -> " << p[j].dir << endl;
  171.         }
  172.         cout << endl;*/
  173.  
  174.  
  175.         for (int j = 0; j < n; j++) {
  176.             if (p[j].dir == 0) {
  177.                 res[ p[j].num ] = sum(p[j].y - p[j].x);
  178.             }          
  179.             insert(p[j].y - p[j].x);
  180.             //draw(root, 0);
  181.             //cout << "---------------\n";
  182.         }
  183.  
  184.         for (int j = 0; j < n; j++)
  185.             p[j].rot();
  186.     }
  187.  
  188.     for (int i = 0; i < n; i++)
  189.         cout << res[i] << "\n";
  190.  
  191.     return 0;
  192. }
  193.  
  194.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement