Advertisement
pb_jiang

luogu P1972 WA

Sep 24th, 2022
49
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.38 KB | None | 0 0
  1. // Problem: P1972 [SDOI2009] HH็š„้กน้“พ
  2. // Contest: Luogu
  3. // URL: https://www.luogu.com.cn/problem/P1972
  4. // Memory Limit: 512 MB
  5. // Time Limit: 2000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8.  
  9. #include <assert.h>
  10. #include <bits/stdc++.h>
  11. using namespace std;
  12. #define dbg(...) logger(#__VA_ARGS__, __VA_ARGS__)
  13. template <typename... Args> void logger(string vars, Args &&... values)
  14. {
  15.     cerr << vars << " = ";
  16.     string delim = "";
  17.     (..., (cerr << delim << values, delim = ", "));
  18.     cerr << endl;
  19. }
  20.  
  21. template <class T> using mpq = priority_queue<T, vector<T>, greater<T>>;
  22. using ll = long long;
  23. using pii = pair<int, int>;
  24. namespace atcoder
  25. {
  26.  
  27. template <class S, S (*op)(S, S), S (*e)(), class F, S (*mapping)(F, S), F (*composition)(F, F), F (*id)()>
  28. struct lazy_segtree {
  29.     int ceil_pow2(int n)
  30.     {
  31.         int x = 0;
  32.         while ((1U << x) < (unsigned int) (n))
  33.             x++;
  34.         return x;
  35.     }
  36.  
  37.   public:
  38.     lazy_segtree() : lazy_segtree(0) {}
  39.     explicit lazy_segtree(int n) : lazy_segtree(std::vector<S>(n, e())) {}
  40.     explicit lazy_segtree(const std::vector<S> &v) : _n(int(v.size()))
  41.     {
  42.         log = ceil_pow2(_n);
  43.         size = 1 << log;
  44.         d = std::vector<S>(2 * size, e());
  45.         lz = std::vector<F>(size, id());
  46.         for (int i = 0; i < _n; i++)
  47.             d[size + i] = v[i];
  48.         for (int i = size - 1; i >= 1; i--) {
  49.             update(i);
  50.         }
  51.     }
  52.  
  53.     void set(int p, S x)
  54.     {
  55.         assert(0 <= p && p < _n);
  56.         p += size;
  57.         for (int i = log; i >= 1; i--)
  58.             push(p >> i);
  59.         d[p] = x;
  60.         for (int i = 1; i <= log; i++)
  61.             update(p >> i);
  62.     }
  63.  
  64.     S get(int p)
  65.     {
  66.         assert(0 <= p && p < _n);
  67.         p += size;
  68.         for (int i = log; i >= 1; i--)
  69.             push(p >> i);
  70.         return d[p];
  71.     }
  72.  
  73.     S prod(int l, int r)
  74.     {
  75.         assert(0 <= l && l <= r && r <= _n);
  76.         if (l == r)
  77.             return e();
  78.  
  79.         l += size;
  80.         r += size;
  81.  
  82.         for (int i = log; i >= 1; i--) {
  83.             if (((l >> i) << i) != l)
  84.                 push(l >> i);
  85.             if (((r >> i) << i) != r)
  86.                 push((r - 1) >> i);
  87.         }
  88.  
  89.         S sml = e(), smr = e();
  90.         while (l < r) {
  91.             if (l & 1)
  92.                 sml = op(sml, d[l++]);
  93.             if (r & 1)
  94.                 smr = op(d[--r], smr);
  95.             l >>= 1;
  96.             r >>= 1;
  97.         }
  98.  
  99.         return op(sml, smr);
  100.     }
  101.  
  102.     S all_prod() { return d[1]; }
  103.  
  104.     void apply(int p, F f)
  105.     {
  106.         assert(0 <= p && p < _n);
  107.         p += size;
  108.         for (int i = log; i >= 1; i--)
  109.             push(p >> i);
  110.         d[p] = mapping(f, d[p]);
  111.         for (int i = 1; i <= log; i++)
  112.             update(p >> i);
  113.     }
  114.     void apply(int l, int r, F f)
  115.     {
  116.         assert(0 <= l && l <= r && r <= _n);
  117.         if (l == r)
  118.             return;
  119.  
  120.         l += size;
  121.         r += size;
  122.  
  123.         for (int i = log; i >= 1; i--) {
  124.             if (((l >> i) << i) != l)
  125.                 push(l >> i);
  126.             if (((r >> i) << i) != r)
  127.                 push((r - 1) >> i);
  128.         }
  129.  
  130.         {
  131.             int l2 = l, r2 = r;
  132.             while (l < r) {
  133.                 if (l & 1)
  134.                     all_apply(l++, f);
  135.                 if (r & 1)
  136.                     all_apply(--r, f);
  137.                 l >>= 1;
  138.                 r >>= 1;
  139.             }
  140.             l = l2;
  141.             r = r2;
  142.         }
  143.  
  144.         for (int i = 1; i <= log; i++) {
  145.             if (((l >> i) << i) != l)
  146.                 update(l >> i);
  147.             if (((r >> i) << i) != r)
  148.                 update((r - 1) >> i);
  149.         }
  150.     }
  151.  
  152.     template <bool (*g)(S)> int max_right(int l)
  153.     {
  154.         return max_right(l, [](S x) { return g(x); });
  155.     }
  156.     template <class G> int max_right(int l, G g)
  157.     {
  158.         assert(0 <= l && l <= _n);
  159.         assert(g(e()));
  160.         if (l == _n)
  161.             return _n;
  162.         l += size;
  163.         for (int i = log; i >= 1; i--)
  164.             push(l >> i);
  165.         S sm = e();
  166.         do {
  167.             while (l % 2 == 0)
  168.                 l >>= 1;
  169.             if (!g(op(sm, d[l]))) {
  170.                 while (l < size) {
  171.                     push(l);
  172.                     l = (2 * l);
  173.                     if (g(op(sm, d[l]))) {
  174.                         sm = op(sm, d[l]);
  175.                         l++;
  176.                     }
  177.                 }
  178.                 return l - size;
  179.             }
  180.             sm = op(sm, d[l]);
  181.             l++;
  182.         } while ((l & -l) != l);
  183.         return _n;
  184.     }
  185.  
  186.     template <bool (*g)(S)> int min_left(int r)
  187.     {
  188.         return min_left(r, [](S x) { return g(x); });
  189.     }
  190.     template <class G> int min_left(int r, G g)
  191.     {
  192.         assert(0 <= r && r <= _n);
  193.         assert(g(e()));
  194.         if (r == 0)
  195.             return 0;
  196.         r += size;
  197.         for (int i = log; i >= 1; i--)
  198.             push((r - 1) >> i);
  199.         S sm = e();
  200.         do {
  201.             r--;
  202.             while (r > 1 && (r % 2))
  203.                 r >>= 1;
  204.             if (!g(op(d[r], sm))) {
  205.                 while (r < size) {
  206.                     push(r);
  207.                     r = (2 * r + 1);
  208.                     if (g(op(d[r], sm))) {
  209.                         sm = op(d[r], sm);
  210.                         r--;
  211.                     }
  212.                 }
  213.                 return r + 1 - size;
  214.             }
  215.             sm = op(d[r], sm);
  216.         } while ((r & -r) != r);
  217.         return 0;
  218.     }
  219.  
  220.   private:
  221.     int _n, size, log;
  222.     std::vector<S> d;
  223.     std::vector<F> lz;
  224.  
  225.     void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
  226.     void all_apply(int k, F f)
  227.     {
  228.         d[k] = mapping(f, d[k]);
  229.         if (k < size)
  230.             lz[k] = composition(f, lz[k]);
  231.     }
  232.     void push(int k)
  233.     {
  234.         all_apply(2 * k, lz[k]);
  235.         all_apply(2 * k + 1, lz[k]);
  236.         lz[k] = id();
  237.     }
  238. };
  239.  
  240. } // namespace atcoder
  241.  
  242. using atcoder::lazy_segtree;
  243. using S = int;
  244. using F = int;
  245. S op(S a, S b) { return max(a, b); }
  246. S e() { return 0; }
  247. S mapping(F f, S r) { return f + r; }
  248. F id() { return 0; }
  249. F composition(F f, F g) { return f + g; }
  250.  
  251. using piii = pair<pii, int>;
  252. int n, m;
  253. int a[1000003];
  254. piii q[1000003];
  255. int main(int argc, char **argv)
  256. {
  257.     scanf("%d", &n);
  258.     for (int i = 0; i < n; ++i)
  259.         scanf("%d", a + i);
  260.     scanf("%d", &m);
  261.     for (int i = 0; i < m; ++i)
  262.         scanf("%d%d", &q[i].first.second, &q[i].first.first), q[i].second = i;
  263.     sort(q, q + m);
  264.  
  265.     vector<int> ans(m);
  266.     unordered_map<int, int> last_appear;
  267.     lazy_segtree<S, op, e, F, mapping, composition, id> seg(1000003);
  268.     for (int i = 0, aid = 0; i < m; ++i) {
  269.         while (aid < n && aid <= q[i].first.first) {
  270.             int left = (last_appear.count(a[aid]) ? last_appear[a[aid]] + 1 : 0);
  271.             seg.apply(left, aid + 1, 1);
  272.             dbg(left, aid, a[aid]);
  273.             last_appear[a[aid]] = aid;
  274.             ++aid;
  275.         }
  276.  
  277.         int l = q[i].first.second, r = q[i].first.first + 1;
  278.         int a = seg.prod(l, r);
  279.         dbg(l, r, a, aid);
  280.         for (int x = 1; x <= n; ++x)
  281.             dbg(seg.get(x));
  282.         ans[q[i].second] = seg.prod(q[i].first.second, q[i].first.first + 1);
  283.         // ans[q[i].second] = seg.get(q[i].first.second);
  284.     }
  285.     for (auto n : ans)
  286.         printf("%d\n", n);
  287.  
  288.     return 0;
  289. };
  290.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement