Advertisement
Guest User

USACO Contest March 2014 - The Lazy Cow

a guest
Mar 11th, 2014
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <fstream>
  2. #include <iostream>
  3. #include <set>
  4.  
  5. #define RIGHT 2097152
  6. #define SIZE 4200000
  7.  
  8. using namespace std;
  9.  
  10. ifstream fin("lazy.in");
  11. ofstream fout("lazy.out");
  12.  
  13. struct Event
  14. {
  15.     int type;
  16.     int x, y1, y2, v;
  17.     Event(int p1, int p2, int p3, int p4, int p5) : type(p1), x(p2), y1(p3), y2(p4), v(p5) {};
  18.     friend bool operator < (Event a, Event b)
  19.     {
  20.         if(a.x < b.x)
  21.             return true;
  22.         if(a.x > b.x)
  23.             return false;
  24.         if(a.type < b.type)
  25.             return true;
  26.         if(a.type > b.type)
  27.             return false;
  28.  
  29.         return true;
  30.     }
  31. };
  32.  
  33. enum{DEL, ADD};
  34. int N, K;
  35. int Lazy[SIZE], T[SIZE];
  36. multiset<Event> E;
  37.  
  38. void update(int l, int r, int v, int n, int a, int b)
  39. {
  40.     if(a > r || b < l)
  41.         return;
  42.     if(a >= l && b <= r)
  43.     {
  44.         T[n] += v;
  45.         Lazy[n] += v;
  46.         return;
  47.     }
  48.  
  49.     if(Lazy[n] != 0)
  50.     {
  51.         if(a != b)
  52.         {
  53.             Lazy[2*n] += Lazy[n];
  54.             Lazy[2*n + 1] += Lazy[n];
  55.             T[2*n] += Lazy[n];
  56.             T[2*n + 1] += Lazy[n];
  57.         }
  58.  
  59.         Lazy[n] = 0;
  60.     }
  61.  
  62.     int mid = (a+b) / 2;
  63.     update(l, r, v, 2*n, a, mid);
  64.     update(l, r, v, 2*n + 1, mid + 1, b);
  65.  
  66.     T[n] = max(T[2*n], T[2*n + 1]);
  67. }
  68.  
  69. int main()
  70. {
  71.     fin >> N >> K;
  72.  
  73.     for(int i = 1; i <= N; i++)
  74.     {
  75.         int g;
  76.         int tx, ty;
  77.         int x, y;
  78.  
  79.         fin >> g >> tx >> ty;
  80.  
  81.         x = tx + ty;
  82.         y = ty - tx + 1000001;
  83.  
  84.         E.insert(Event(ADD, x-K, max(y-K, 1), min(y+K, RIGHT), g));
  85.         E.insert(Event(DEL, x+K+1, max(y-K, 1), min(y+K, RIGHT), -g));
  86.     }
  87.  
  88.     int ans = 0;
  89.  
  90.     for(set<Event>::iterator it = E.begin(); it != E.end(); it++)
  91.     {
  92.         update(it->y1, it->y2, it->v, 1, 1, RIGHT);
  93.         ans = max(ans, T[1]);
  94.     }
  95.  
  96.     cout << ans << "\n";
  97.     fout << ans << "\n";
  98. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement