Advertisement
pb_jiang

abc106d ac segtree/2d prefixsum

Nov 22nd, 2022
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.83 KB | None | 0 0
  1. // Problem: D - AtCoder Express 2
  2. // Contest: AtCoder - AtCoder Beginner Contest 106
  3. // URL: https://atcoder.jp/contests/abc106/tasks/abc106_d
  4. // Memory Limit: 976 MB
  5. // Time Limit: 3000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. #include <atcoder/segtree>
  12. using namespace std;
  13. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  14. template <typename... Args> void logger(string vars, Args &&...values)
  15. {
  16.     cerr << vars << " = ";
  17.     string delim = "";
  18.     (..., (cerr << delim << values, delim = ", "));
  19.     cerr << endl;
  20. }
  21.  
  22. template <class T> inline auto vv(int m) { return vector<vector<T>>(m, vector<T>(m)); }
  23. template <class T> inline auto vv(int m, int n) { return vector<vector<T>>(m, vector<T>(n)); }
  24. template <class T, T init> inline auto vv(int m) { return vector<vector<T>>(m, vector<T>(m, init)); }
  25. template <class T, T init> inline auto vv(int m, int n) { return vector<vector<T>>(m, vector<T>(n, init)); }
  26.  
  27. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  28. using ll = long long;
  29. using pii = pair<int, int>;
  30. using atcoder::segtree;
  31.  
  32. using S = int;
  33. S op(S a, S b) { return a + b; }
  34. S e() { return 0; }
  35.  
  36. int n, m, q;
  37. vector<pii> lr;
  38. vector<pii> pq;
  39.  
  40. int main(int argc, char **argv)
  41. {
  42.     cin >> n >> m >> q;
  43.     lr = vector<pii>(m);
  44.     for (int i = 0; i < m; ++i)
  45.         cin >> lr[i].first >> lr[i].second;
  46.     pq = vector<pii>(q);
  47.     for (int i = 0; i < q; ++i)
  48.         cin >> pq[i].first >> pq[i].second;
  49.     using piii = pair<pii, int>;
  50.     auto pqi = vector<piii>(q);
  51.     for (int i = 0; i < q; ++i)
  52.         pqi[i] = {pq[i], i};
  53.     sort(pqi.begin(), pqi.end());
  54.     sort(lr.begin(), lr.end());
  55.     vector<S> v(501);
  56.     for (auto [l, r] : lr)
  57.         v[r] += 1;
  58.     segtree<S, op, e> seg(v);
  59.     int i1 = 0, i2 = 0;
  60.     vector<int> ans(q);
  61.     for (i2 = 0; i2 < q; ++i2) {
  62.         while (i1 < m && lr[i1].first < pqi[i2].first.first) {
  63.             seg.set(lr[i1].second, seg.get(lr[i1].second) - 1);
  64.             i1++;
  65.         }
  66.         ans[pqi[i2].second] = seg.prod(pqi[i2].first.first, pqi[i2].first.second + 1);
  67.     }
  68.     for (int i = 0; i < q; ++i)
  69.         cout << ans[i] << endl;
  70.     return 0;
  71. }
  72.  
  73. int main1(int argc, char **argv)
  74. {
  75.     cin >> n >> m >> q;
  76.     lr = vector<pii>(m);
  77.     for (int i = 0; i < m; ++i)
  78.         cin >> lr[i].first >> lr[i].second;
  79.     pq = vector<pii>(q);
  80.     for (int i = 0; i < q; ++i)
  81.         cin >> pq[i].first >> pq[i].second;
  82.  
  83.     auto arr = vv<int>(502);
  84.     for (auto [l, r] : lr)
  85.         arr[l][r] += 1;
  86.  
  87.     auto dp = vv<int>(502);
  88.     for (int l = 500; l >= 0; --l)
  89.         for (int r = l; r <= 500; ++r)
  90.             dp[l][r] = dp[l][r - 1] + dp[l + 1][r] - dp[l + 1][r - 1] + arr[l][r];
  91.  
  92.     for (auto [l, r] : pq)
  93.         cout << dp[l][r] << endl;
  94.  
  95.     return 0;
  96. };
  97.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement