Guest User

Untitled

a guest
Sep 20th, 2024
284
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.48 KB | None | 0 0
  1. /***************************************************
  2. * Author  : Anav Prasad
  3. * Handle  : vrangr
  4. * Created : Fri Sep 20 20:31:58 IST 2024
  5. ****************************************************/
  6. #include <bits/stdc++.h>
  7.  
  8. #define debug(...) (void)42
  9. #ifdef LOCAL
  10.     #undef debug
  11.     #include <algo/debug.hpp>
  12.     const bool DEBUG = true;
  13. #else
  14.     [[maybe_unused]] const bool DEBUG = false;
  15. #endif
  16.  
  17. using namespace std;
  18.  
  19. typedef unsigned int uint;
  20. typedef long long int ll;
  21. typedef unsigned long long int ull;
  22. typedef long double ld;
  23. typedef __int128_t i128;
  24. #define endl "\n"
  25. #define fastIO ios_base::sync_with_stdio(false),cin.tie(0)
  26. #define TEST int T;cin>>T;while(T--)solve();
  27. #define TEST1 solve();
  28. #define all(x) (x).begin(), (x).end()
  29. #define rall(x) (x).rbegin(), (x).rend()
  30. #define sz(v) ((int)(v).size())
  31. #define GET_MACRO(_1,_2,_3,_4,NAME,...) NAME
  32. #define rep(...) GET_MACRO(__VA_ARGS__, forsn, debug, forn)(__VA_ARGS__)
  33. #define forn(i, n) for (__typeof(n) i = 0; i < n; i++)
  34. #define forsn(i, st, end, d) for(__typeof(end) i = st; (d>0?i<=end:i>=end); i+=((__typeof(end))d))
  35. template<typename type>inline void print_vec(const vector<type> &v){rep(i,sz(v))cout<<v[i]<<" \n"[i==sz(v)-1];}
  36. void solve();
  37. #ifndef ATCODER_INTERNAL_BITOP_HPP
  38. #define ATCODER_INTERNAL_BITOP_HPP 1
  39.  
  40. #ifdef _MSC_VER
  41. #include <intrin.h>
  42. #endif
  43.  
  44. namespace atcoder {
  45.  
  46. namespace internal {
  47.  
  48. // @param n `0 <= n`
  49. // @return minimum non-negative `x` s.t. `n <= 2**x`
  50. int ceil_pow2(int n) {
  51.     int x = 0;
  52.     while ((1U << x) < (unsigned int)(n)) x++;
  53.     return x;
  54. }
  55.  
  56. // @param n `1 <= n`
  57. // @return minimum non-negative `x` s.t. `(n & (1 << x)) != 0`
  58. int bsf(unsigned int n) {
  59. #ifdef _MSC_VER
  60.     unsigned long index;
  61.     _BitScanForward(&index, n);
  62.     return index;
  63. #else
  64.     return __builtin_ctz(n);
  65. #endif
  66. }
  67.  
  68. }  // namespace internal
  69.  
  70. }  // namespace atcoder
  71.  
  72. #endif  // ATCODER_INTERNAL_BITOP_HPP
  73.  
  74. #ifndef ATCODER_LAZYSEGTREE_HPP
  75. #define ATCODER_LAZYSEGTREE_HPP 1
  76.  
  77. #include <algorithm>
  78. #include <cassert>
  79. #include <iostream>
  80. #include <vector>
  81. namespace atcoder {
  82.  
  83. template <class S,
  84.           S (*op)(S, S),
  85.           S (*e)(),
  86.           class F,
  87.           S (*mapping)(F, S),
  88.           F (*composition)(F, F),
  89.           F (*id)()>
  90. struct lazy_segtree {
  91.   public:
  92.     lazy_segtree() : lazy_segtree(0) {}
  93.     lazy_segtree(int n) : lazy_segtree(std::vector<S>(n, e())) {}
  94.     lazy_segtree(const std::vector<S>& v) : _n(int(v.size())) {
  95.         log = internal::ceil_pow2(_n);
  96.         size = 1 << log;
  97.         d = std::vector<S>(2 * size, e());
  98.         lz = std::vector<F>(size, id());
  99.         for (int i = 0; i < _n; i++) d[size + i] = v[i];
  100.         for (int i = size - 1; i >= 1; i--) {
  101.             update(i);
  102.         }
  103.     }
  104.  
  105.     void set(int p, S x) {
  106.         assert(0 <= p && p < _n);
  107.         p += size;
  108.         for (int i = log; i >= 1; i--) push(p >> i);
  109.         d[p] = x;
  110.         for (int i = 1; i <= log; i++) update(p >> i);
  111.     }
  112.  
  113.     S get(int p) {
  114.         assert(0 <= p && p < _n);
  115.         p += size;
  116.         for (int i = log; i >= 1; i--) push(p >> i);
  117.         return d[p];
  118.     }
  119.  
  120.     S prod(int l, int r) {
  121.         assert(0 <= l && l <= r && r <= _n);
  122.         if (l == r) return e();
  123.  
  124.         l += size;
  125.         r += size;
  126.  
  127.         for (int i = log; i >= 1; i--) {
  128.             if (((l >> i) << i) != l) push(l >> i);
  129.             if (((r >> i) << i) != r) push(r >> i);
  130.         }
  131.  
  132.         S sml = e(), smr = e();
  133.         while (l < r) {
  134.             if (l & 1) sml = op(sml, d[l++]);
  135.             if (r & 1) smr = op(d[--r], smr);
  136.             l >>= 1;
  137.             r >>= 1;
  138.         }
  139.  
  140.         return op(sml, smr);
  141.     }
  142.  
  143.     S all_prod() { return d[1]; }
  144.  
  145.     void apply(int p, F f) {
  146.         assert(0 <= p && p < _n);
  147.         p += size;
  148.         for (int i = log; i >= 1; i--) push(p >> i);
  149.         d[p] = mapping(f, d[p]);
  150.         for (int i = 1; i <= log; i++) update(p >> i);
  151.     }
  152.     void apply(int l, int r, F f) {
  153.         assert(0 <= l && l <= r && r <= _n);
  154.         if (l == r) return;
  155.  
  156.         l += size;
  157.         r += size;
  158.  
  159.         for (int i = log; i >= 1; i--) {
  160.             if (((l >> i) << i) != l) push(l >> i);
  161.             if (((r >> i) << i) != r) push((r - 1) >> i);
  162.         }
  163.  
  164.         {
  165.             int l2 = l, r2 = r;
  166.             while (l < r) {
  167.                 if (l & 1) all_apply(l++, f);
  168.                 if (r & 1) all_apply(--r, f);
  169.                 l >>= 1;
  170.                 r >>= 1;
  171.             }
  172.             l = l2;
  173.             r = r2;
  174.         }
  175.  
  176.         for (int i = 1; i <= log; i++) {
  177.             if (((l >> i) << i) != l) update(l >> i);
  178.             if (((r >> i) << i) != r) update((r - 1) >> i);
  179.         }
  180.     }
  181.  
  182.     template <bool (*g)(S)> int max_right(int l) {
  183.         return max_right(l, [](S x) { return g(x); });
  184.     }
  185.     template <class G> int max_right(int l, G g) {
  186.         assert(0 <= l && l <= _n);
  187.         assert(g(e()));
  188.         if (l == _n) return _n;
  189.         l += size;
  190.         for (int i = log; i >= 1; i--) push(l >> i);
  191.         S sm = e();
  192.         do {
  193.             while (l % 2 == 0) l >>= 1;
  194.             if (!g(op(sm, d[l]))) {
  195.                 while (l < size) {
  196.                     push(l);
  197.                     l = (2 * l);
  198.                     if (g(op(sm, d[l]))) {
  199.                         sm = op(sm, d[l]);
  200.                         l++;
  201.                     }
  202.                 }
  203.                 return l - size;
  204.             }
  205.             sm = op(sm, d[l]);
  206.             l++;
  207.         } while ((l & -l) != l);
  208.         return _n;
  209.     }
  210.  
  211.     template <bool (*g)(S)> int min_left(int r) {
  212.         return min_left(r, [](S x) { return g(x); });
  213.     }
  214.     template <class G> int min_left(int r, G g) {
  215.         assert(0 <= r && r <= _n);
  216.         assert(g(e()));
  217.         if (r == 0) return 0;
  218.         r += size;
  219.         for (int i = log; i >= 1; i--) push((r - 1) >> i);
  220.         S sm = e();
  221.         do {
  222.             r--;
  223.             while (r > 1 && (r % 2)) r >>= 1;
  224.             if (!g(op(d[r], sm))) {
  225.                 while (r < size) {
  226.                     push(r);
  227.                     r = (2 * r + 1);
  228.                     if (g(op(d[r], sm))) {
  229.                         sm = op(d[r], sm);
  230.                         r--;
  231.                     }
  232.                 }
  233.                 return r + 1 - size;
  234.             }
  235.             sm = op(d[r], sm);
  236.         } while ((r & -r) != r);
  237.         return 0;
  238.     }
  239.  
  240.   private:
  241.     int _n, size, log;
  242.     std::vector<S> d;
  243.     std::vector<F> lz;
  244.  
  245.     void update(int k) { d[k] = op(d[2 * k], d[2 * k + 1]); }
  246.     void all_apply(int k, F f) {
  247.         d[k] = mapping(f, d[k]);
  248.         if (k < size) lz[k] = composition(f, lz[k]);
  249.     }
  250.     void push(int k) {
  251.         all_apply(2 * k, lz[k]);
  252.         all_apply(2 * k + 1, lz[k]);
  253.         lz[k] = id();
  254.     }
  255. };
  256.  
  257. }  // namespace atcoder
  258.  
  259. #endif  // ATCODER_LAZYSEGTREE_HPP
  260.  
  261. int main() {
  262.     fastIO;
  263.     TEST;
  264. #ifdef LOCAL
  265.     cout << "\nTime elapsed: " << (double)clock() / CLOCKS_PER_SEC << " s.\n";
  266. #endif
  267.     return 0;
  268. }
  269.  
  270. class S {
  271. public:
  272.     ll val;
  273.     S() : val(0ll) {}
  274.     S(ll v) : val(v) {}
  275. };
  276.  
  277. S op(S a, S b) {
  278.     return S(a.val+b.val);
  279. }
  280.  
  281. S e() {
  282.     return S();
  283. }
  284.  
  285. class F {
  286. public:
  287.     ll val;
  288.     F() : val(LLONG_MIN){}
  289.     F(ll v) : val(v){}
  290. };
  291.  
  292. S mapping(F f, S x) {
  293.     if (f.val == LLONG_MIN) return x;
  294.     return S(f.val);
  295. }
  296.  
  297. F composition(F f, F g) {
  298.     if (f.val == LLONG_MIN) return g;
  299.     if (g.val == LLONG_MIN) return f;
  300.     return f;
  301. }
  302.  
  303. F id() {
  304.     return F();
  305. }
  306.  
  307. void solve() {
  308.     ll n; cin >> n;
  309.     vector<ll> a(n);
  310.     rep(i,n) cin >> a[i];
  311.     vector<S> vec(n);
  312.     atcoder::lazy_segtree<S, op, e, F, mapping, composition, id> seg(vec);
  313.     rep(i,n) {
  314.         if (i == 0 || seg.get(i-1).val <= a[i]) {
  315.             seg.apply(i,F(a[i]));
  316.             continue;
  317.         }
  318.         ll low = 0ll, high = i-1ll;
  319.         while(low < high) {
  320.             ll mid = (low+high)/2ll;
  321.             ll sum = seg.prod(mid,i).val;
  322.             if ((sum+a[i])/(i-mid+1ll) <= seg.get(mid).val)
  323.                 high = mid;
  324.             else low = mid+1ll;
  325.         }
  326.         assert(high < i);
  327.         ll sum = (seg.prod(high,i).val + a[i]), ct = i-high+1ll;
  328.         ll rem = sum%ct, avg = sum/ct;
  329.         seg.apply(high,high+ct-rem,F(avg));
  330.         if (rem) seg.apply(high+ct-rem,i+1ll,F(avg+1ll));
  331.         if (high) assert(seg.get(high-1ll).val <= seg.get(high).val);
  332.     }
  333.     cout << seg.get(n-1ll).val - seg.get(0ll).val << endl;
  334. }
Advertisement
Add Comment
Please, Sign In to add comment