Submission #696323

#TimeUsernameProblemLanguageResultExecution timeMemory
696323yaufungGrowing Vegetables is Fun 4 (JOI21_ho_t1)C++17
0 / 100
1 ms212 KiB
#include <bits/stdc++.h> using namespace std; #define LL long long struct segtree { int l, r, mid; LL val = 0, lazy = 0; segtree *lc, *rc; segtree(int L, int R) { l = L; r = R; mid = (l + r) / 2; if (l != r) { lc = new segtree(l, mid); rc = new segtree(mid + 1, r); } } void apply(LL X) { // val += X; val += X * (r - l + 1); lazy += X; } void push() { if (l == r) return; lc->apply(lazy); rc->apply(lazy); lazy = 0; } void update(int L, int R, LL X) { push(); if (l == L && r == R) { apply(X); return; } else if (R <= mid) lc->update(L, R, X); else if (L >= mid + 1) rc->update(L, R, X); else { lc->update(L, mid, X); rc->update(mid + 1, R, X); } // val = min(lc->val, rc->val); val = lc->val + rc->val; } LL query(int L, int R) { push(); if (l == L && r == R) return val; else if (R <= mid) return lc->query(L, R); else if (L >= mid + 1) return rc->query(L, R); else { // return min(lc->query(L, mid), rc->query(mid + 1, R)); return lc->query(L, mid) + rc->query(mid + 1, R); } } //segroot = new segtree(0, n - 1) } *segroot; int main() { ios::sync_with_stdio(false), cin.tie(0); int n; cin >> n; long long ans = 0; vector<long long> a(n + 1); vector<bool> b(n + 1, false); for (int i = 1; i <= n; i++) { cin >> a[i]; } int l = 2, r = n - 1; while (l <= n && a[l] > a[l - 1]) l++; while (r >= 1 && a[r] > a[r + 1]) r--; if (l > n || r < 1) { cout << "0\n"; return 0; } segroot = new segtree(0, n + 1); for (int i = 1; i <= n; i++) { segroot->update(i, i, a[i]); } while (l <= r) { long long L = segroot->query(l, l); long long L1 = segroot->query(l-1, l-1); long long R = segroot->query(r, r); long long R1 = segroot->query(r+1, r+1); long long add = min(abs(L - L1), abs(R - R1)) + 1; ans += add; segroot->update(l, r, add); while (l <= n && (segroot->query(l, l)) > (segroot->query(l-1, l-1))) { l++; } while (r >= 1 && (segroot->query(r, r)) > (segroot->query(r+1, r+1))) { r--; } } if (l <= n && r >= 1 && a[l] == a[r]) ans++; cout << ans << endl; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...