niyaznigmatullin

Zhautykov olympiad 2015, problem Heroes

Nov 20th, 2016
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.17 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstdlib>
  4. #include <cassert>
  5. #include <ctime>
  6. #include <cstring>
  7. #include <string>
  8. #include <set>
  9. #include <map>
  10. #include <vector>
  11. #include <list>
  12. #include <deque>
  13. #include <queue>
  14. #include <sstream>
  15. #include <iostream>
  16. #include <algorithm>
  17.  
  18. using namespace std;
  19.  
  20. #define pb push_back
  21. #define mp make_pair
  22. #define fs first
  23. #define sc second
  24.  
  25. const double pi = acos(-1.0);
  26.  
  27. const int size = 200 * 1000 + 100;
  28. const int blocksize = 500;
  29.  
  30. int a[size], b[size], c[size], d[size];
  31. int ans[size];
  32. int startpoint[size];
  33. int startdamage[size];
  34. long long damage[size];
  35. long long delta[size];
  36. int n, m;
  37.  
  38. int main() {
  39.     freopen("heroes.in", "r", stdin);
  40.     freopen("heroes.out", "w", stdout);
  41.  
  42.     scanf("%d%d", &n, &m);
  43.     for (int i = 0; i < n; i++) {
  44.         scanf("%d%d", &a[i], &b[i]);
  45.     }
  46.     int maxc = blocksize;
  47.     for (int i = 0; i < m; i++) {
  48.         scanf("%d%d", &c[i], &d[i]);
  49.         maxc = max(maxc, d[i]);
  50.     }
  51.     for (int i = 0; i < n; i++)
  52.         a[i] = min(a[i], maxc);
  53.  
  54.     for (int i = 0; i < m; i++) {
  55.         if ((i + 1) % blocksize == 0) {
  56.             long long cur = 0;
  57.             for (int j = 0; j <= maxc; j++) {
  58.                 cur += delta[j];
  59.                 damage[j] += cur;
  60.                 delta[j] = 0;
  61.             }
  62.             for (int j = 0; j < n; j++)
  63.                 if (damage[a[j]] < b[j]) {
  64.                     startpoint[j] = i;
  65.                     startdamage[j] = (int) damage[a[j]];
  66.                 }  
  67.         }
  68.         for (int j = 1; j <= blocksize; j++)
  69.             damage[j] += ((d[i] + j - 1) / j) * 1ll * c[i];
  70.         int prev = maxc + 1;
  71.         for (int j = 1; j <= blocksize; j++) {
  72.             int cur = (d[i] + j - 1) / j;
  73.             cur = max(cur, blocksize + 1);
  74.             delta[cur] += j * c[i];
  75.             delta[prev] -= j * c[i];
  76.  
  77.             if (cur == blocksize + 1)
  78.                 break;
  79.             else
  80.                 prev = cur;
  81.         }        
  82.     }
  83.  
  84.     for (int i = 0; i < n; i++) {
  85.         int cur = startpoint[i];
  86.         b[i] -= startdamage[i];
  87.         while (cur < m) {
  88.             int s1 = (d[cur] + a[i] - 1) / a[i];
  89.             int s2 = (b[i] + c[cur] - 1) / c[cur];
  90.  
  91.             b[i] -= min(s1, s2) * c[cur];
  92.            
  93.             if (s1 <= s2)
  94.                 cur++;
  95.             if (b[i] <= 0)
  96.                 break;
  97.         }
  98.  
  99.         printf("%d\n", cur);
  100.     }
  101.  
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment