Advertisement
pb_jiang

2382 leetcode - wa

Sep 11th, 2022 (edited)
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.23 KB | None | 0 0
  1. //#include <bits/stdc++.h>
  2. //#include <cassert>
  3. namespace atcoder
  4. {
  5.  
  6. template <class S, S (*op)(S, S), S (*e)()> struct segtree {
  7.     int ceil_pow2(int n)
  8.     {
  9.         int x = 0;
  10.         while ((1U << x) < (unsigned int) (n))
  11.             x++;
  12.         return x;
  13.     }
  14.  
  15.   public:
  16.     segtree() : segtree(0) {}
  17.     explicit segtree(int n) : segtree(std::vector<S>(n, e())) {}
  18.     explicit segtree(const std::vector<S> &v) : _n(int(v.size()))
  19.     {
  20.         log = ceil_pow2(_n);
  21.         size = 1 << log;
  22.         d = std::vector<S>(2 * size, e());
  23.         for (int i = 0; i < _n; i++)
  24.             d[size + i] = v[i];
  25.         for (int i = size - 1; i >= 1; i--) {
  26.             update(i);
  27.         }
  28.     }
  29.  
  30.     void set(int p, S x)
  31.     {
  32.         assert(0 <= p && p < _n);
  33.         p += size;
  34.         d[p] = x;
  35.         for (int i = 1; i <= log; i++)
  36.             update(p >> i);
  37.     }
  38.  
  39.     S get(int p) const
  40.     {
  41.         assert(0 <= p && p < _n);
  42.         return d[p + size];
  43.     }
  44.  
  45.     S prod(int l, int r) const
  46.     {
  47.         assert(0 <= l && l <= r && r <= _n);
  48.         S sml = e(), smr = e();
  49.         l += size;
  50.         r += size;
  51.  
  52.         while (l < r) {
  53.             if (l & 1)
  54.                 sml = op(sml, d[l++]);
  55.             if (r & 1)
  56.                 smr = op(d[--r], smr);
  57.             l >>= 1;
  58.             r >>= 1;
  59.         }
  60.         return op(sml, smr);
  61.     }
  62.  
  63.     S all_prod() const { return d[1]; }
  64.  
  65.     template <bool (*f)(S)> int max_right(int l) const
  66.     {
  67.         return max_right(l, [](S x) { return f(x); });
  68.     }
  69.     template <class F> int max_right(int l, F f) const
  70.     {
  71.         assert(0 <= l && l <= _n);
  72.         assert(f(e()));
  73.         if (l == _n)
  74.             return _n;
  75.         l += size;
  76.         S sm = e();
  77.         do {
  78.             while (l % 2 == 0)
  79.                 l >>= 1;
  80.             if (!f(op(sm, d[l]))) {
  81.                 while (l < size) {
  82.                     l = (2 * l);
  83.                     if (f(op(sm, d[l]))) {
  84.                         sm = op(sm, d[l]);
  85.                         l++;
  86.                     }
  87.                 }
  88.                 return l - size;
  89.             }
  90.             sm = op(sm, d[l]);
  91.             l++;
  92.         } while ((l & -l) != l);
  93.         return _n;
  94.     }
  95.  
  96.     template <bool (*f)(S)> int min_left(int r) const
  97.     {
  98.         return min_left(r, [](S x) { return f(x); });
  99.     }
  100.     template <class F> int min_left(int r, F f) const
  101.     {
  102.         assert(0 <= r && r <= _n);
  103.         assert(f(e()));
  104.         if (r == 0)
  105.             return 0;
  106.         r += size;
  107.         S sm = e();
  108.         do {
  109.             r--;
  110.             while (r > 1 && (r % 2))
  111.                 r >>= 1;
  112.             if (!f(op(d[r], sm))) {
  113.                 while (r < size) {
  114.                     r = (2 * r + 1);
  115.                     if (f(op(d[r], sm))) {
  116.                         sm = op(d[r], sm);
  117.                         r--;
  118.                     }
  119.                 }
  120.                 return r + 1 - size;
  121.             }
  122.             sm = op(d[r], sm);
  123.         } while ((r & -r) != r);
  124.         return 0;
  125.     }
  126.  
  127.   private:
  128.     int _n, size, log;
  129.     std::vector<S> d;
  130.  
  131.     void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
  132. };
  133.  
  134. } // namespace atcoder
  135. using atcoder::segtree;
  136. using ll = long long;
  137. struct S {
  138.     ll max_val;
  139.     ll lmargin, rmargin;
  140.     int lfull, rfull, nz;
  141. };
  142. S op(S a, S b)
  143. {
  144.     S ret{max(a.max_val, b.max_val), a.lmargin, b.rmargin, a.lfull, b.rfull, a.nz && b.nz};
  145.     if (a.lfull && a.nz == 0) {
  146.         ret.lmargin = a.lmargin + b.lmargin;
  147.     }
  148.     if (b.rfull && b.nz == 0) {
  149.         ret.lmargin = a.rmargin + b.rmargin;
  150.     }
  151.     ret.max_val = max(ret.max_val, max(ret.lmargin, ret.rmargin));
  152.     ret.max_val = max(ret.max_val, a.rmargin + b.lmargin);
  153.     return ret;
  154. }
  155. S e() { return S{0, 0, 0, 0, 0, 0}; }
  156. class Solution
  157. {
  158.   public:
  159.     vector<long long> maximumSegmentSum(vector<int> &ns, vector<int> &rq)
  160.     {
  161.         int n = ns.size();
  162.         vector<ll> ret(rq.size());
  163.         segtree<S, op, e> seg(n);
  164.         for (int i = rq.size() - 1; i >= 0; --i) {
  165.             ret[i] = seg.all_prod().max_val;
  166.             seg.set(rq[i], S{ns[rq[i]], ns[rq[i]], ns[rq[i]], 1, 1, 1});
  167.         }
  168.         return ret;
  169.     }
  170. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement