Advertisement
wym1111

Untitled

Apr 1st, 2024
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.40 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4. #define endl '\n'
  5. using ll = long long;
  6.  
  7. const int N = 1e5 + 10;
  8.  
  9. int n;
  10. ll a[N], pre[N], cost[N];
  11. int lst[N], lim[N], nxt[N];
  12.  
  13. struct Node {
  14.     ll lmi, rmi, mi, sum;
  15. };
  16.  
  17. class Segment {
  18. private:
  19.     ll a[N];
  20.     Node node[N << 2];
  21. public:
  22.     void init (int n, ll num[]) {
  23.         for (int i = 1; i <= n; i ++) a[i] = num[i];
  24.     }
  25.     void build (int s, int t, int p) {
  26.         if (s == t) {
  27.             node[p].sum = a[s];
  28.             node[p].mi = node[p].lmi = node[p].rmi = min(0LL, a[s]);
  29.             return;
  30.         }
  31.         int mid = (s + t) >> 1;
  32.         build(s, mid, p << 1);
  33.         build(mid + 1, t, p << 1 | 1);
  34.     }
  35.     Node merge (Node &x, Node &y) {
  36.         Node res;
  37.         res.sum = x.sum + y.sum;
  38.         res.lmi = min(x.sum + y.lmi, x.lmi);
  39.         res.rmi = min(x.rmi + y.sum, y.rmi);
  40.         res.mi = min(x.mi, y.mi);
  41.         res.mi = min(res.mi, x.rmi + y.lmi);
  42.         return res;
  43.     }
  44.     void pushup(int p) {
  45.         node[p] = merge(node[p << 1], node[p << 1 | 1]);
  46.     }
  47.     Node query (int l, int r, int s, int t, int p) {
  48.         if (l <= s && t <= r) {
  49.             return node[p];
  50.         }
  51.         int mid = (s + t) >> 1;
  52.         Node res1, res2;
  53.         if (l <= mid) res1 = query(l, r, s, mid, p << 1);
  54.         if (mid < r) res2 = query(l, r, mid + 1, t, p << 1 | 1);
  55.         return merge(res1, res2);
  56.     }
  57. };
  58. Segment seg;
  59.  
  60. void solve () {
  61.     cin >> n;
  62.     int last = 0;
  63.     cost[0] = 0;
  64.     pre[0] = 0;
  65.     ll mi = 0;
  66.     for (int i = 1; i <= n; i ++) {
  67.         cin >> a[i];
  68.         pre[i] = pre[i - 1] + a[i];
  69.         cost[i] = cost[i - 1] + pre[i];
  70.         mi = min(cost[i] - cost[last], mi);
  71. //      cout << i << ' ' << last << ' ' << mi << endl;
  72.         if (pre[i] > pre[last]) {
  73.             nxt[last] = i;
  74.             lim[i] = mi;
  75.             last = i;
  76.             mi = 0;
  77.         }
  78.     }
  79.     if (last != n) {
  80.         nxt[last] = n;
  81.         lim[n] = mi;
  82.     }
  83.     if (lim[nxt[0]] < 0 || pre[n] < 0) {
  84.         cout << "-1\n";
  85.         return;
  86.     }
  87.    
  88. //  cout << "debug\n";
  89. //  for (int i = 0; i <= n; i ++) {
  90. //      cout << i << " : " << nxt[i] << ' ' << lim[nxt[i]] << endl;
  91. //  }
  92.    
  93.     int p = 0;
  94.     ll ans = 0;
  95.     ll sum = 0;
  96.     while (p < n) {
  97.         if (lim[p[nxt]] + sum < 0) {
  98.             ll need = -sum - lim[p[nxt]];
  99.             ll d = (need + pre[p] - 1) / pre[p];
  100. //          cout << d << endl;
  101.             ans += d;
  102.             sum += pre[p] * d;
  103.         }
  104.         sum += cost[nxt[p]] - cost[p];
  105.         ans += nxt[p] - p;
  106.         p = nxt[p];
  107. //      cout << p << ' ' << ans << ' ' << sum << endl;
  108.     }
  109.     cout << ans << endl;
  110. }
  111.  
  112. signed main() {
  113.     ios::sync_with_stdio(false);
  114.     cin.tie(nullptr);
  115.     int _ = 1;
  116. //  cin >> _;
  117.     while(_ --) {
  118.         solve();
  119.     }
  120.     return 0;
  121. }
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement