Submission #1011945

#TimeUsernameProblemLanguageResultExecution timeMemory
1011945fryingducSjeckanje (COCI21_sjeckanje)C++17
110 / 110
229 ms50768 KiB
#include "bits/stdc++.h" using namespace std; #ifdef duc_debug #include "bits/debug.h" #else #define debug(...) #endif #define int long long const int maxn = 2e5+5; int n, a[maxn], q, d[maxn]; namespace sub12{ const int N = 3005; int f[N][2]; void compute(){ d[0] = d[n] = 0; for(int i = 1; i <= n; ++i){ if(d[i] * d[i - 1] < 0){ f[i][0] = max(f[i - 1][1], f[i - 1][0]); f[i][1] = max(f[i - 1][0], f[i - 1][1] - abs(d[i - 1])) + abs(d[i]); } else{ f[i][0] = max(f[i - 1][0], f[i - 1][1]); f[i][1] = max(f[i - 1][0], f[i - 1][1]) + abs(d[i]); } // debug(i, f[i][0], f[i][1]); } } void solve(){ while(q--){ int l, r, x; cin >> l >> r >> x; d[l - 1] -= x; d[r] += x; compute(); cout << max(f[n][0], f[n][1]) << '\n'; } } } namespace sub3{ struct Node{ int f[4], head, tail; Node() { f[0] = f[1] = f[2] = f[3]; } Node (int x, int y, int z, int t, int head, int tail) : head(head), tail(tail) { f[0] = x, f[1] = y, f[2] = z, f[3] = t; } friend Node operator + (const Node &a, const Node &b){ Node res; if(a.tail * b.head < 0){ res.f[0] = max(a.f[2] + b.f[0], a.f[0] + b.f[1]); res.f[1] = max(a.f[1] + b.f[1], a.f[3] + b.f[0]); res.f[2] = max(a.f[0] + b.f[3], a.f[2] + b.f[2]); res.f[3] = max(a.f[1] + b.f[3], a.f[3] + b.f[2]); } else{ res.f[0] = a.f[0] + b.f[0]; res.f[1] = a.f[1] + b.f[0]; res.f[2] = a.f[0] + b.f[2]; res.f[3] = a.f[1] + b.f[2]; } res.head = a.head; res.tail = b.tail; return res; } }; struct SegmentTree{ int n; vector<Node> tree; void init(int sz){ n = sz; tree.resize(n * 4 + 6); } void build(int ind, int l, int r){ if(l == r){ tree[ind] = Node(abs(d[l]), 0, 0, 0, d[l], d[l]); return; } int mid = (l + r) / 2; build(ind * 2, l, mid); build(ind * 2 + 1, mid + 1, r); tree[ind] = tree[ind * 2] + tree[ind * 2 + 1]; } void update(int ind, int l, int r, int pos, int val){ if(l == r){ d[l] += val; tree[ind] = Node(abs(d[l]), 0, 0, 0, d[l], d[l]); return; } int mid = (l + r) / 2; if(l <= pos and pos <= mid) update(ind * 2, l, mid, pos, val); else update(ind * 2 + 1, mid + 1, r, pos, val); tree[ind] = tree[ind * 2] + tree[ind * 2 + 1]; } void update(int pos, int val){ update(1, 1, n, pos, val); } int get(){ return tree[1].f[0]; } } st; void solve(){ st.init(n); st.build(1, 1, n); while(q--){ int l, r, x; cin >> l >> r >> x; if(l > 1) st.update(l - 1, -x); if(r < n) st.update(r, x); cout << st.get() << '\n'; } } } void solve(){ cin >> n >> q; for(int i = 1; i <= n; ++i){ cin >> a[i]; } for(int i = 1; i < n; ++i){ d[i] = (a[i] - a[i + 1]); } // if(n <= 3000){ // sub12::solve(); // return; // } sub3::solve(); } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); solve(); }

Compilation message (stderr)

Main.cpp: In constructor 'sub3::Node::Node()':
Main.cpp:46:37: warning: '*<unknown>.sub3::Node::f[3]' is used uninitialized in this function [-Wuninitialized]
   46 |             f[0] = f[1] = f[2] = f[3];
      |                                  ~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...