제출 #1320774

#제출 시각아이디문제언어결과실행 시간메모리
1320774tkm_algorithmsFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
265 ms15528 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #define int ll using P = pair<int, int>; #define all(x) x.begin(), x.end() #define rep(i, l, n) for (int i = l; i < (n); ++i) #define sz(x) (int)x.size() const char nl = '\n'; const int mod = 1e9+7; struct arr{ vector<int> tree; int size; void init(int n) { size = 1; while (size < n)size <<= 1; tree.assign(2*size-1, 0); } void gos(int i, int v, int x, int lx, int rx) { if (rx-lx == 1) { tree[x] += v; return; } int mid = lx+rx>>1; if(i<mid)gos(i, v, 2*x+1, lx, mid); else gos(i, v, 2*x+2, mid, rx); tree[x] = tree[2*x+1]+tree[2*x+2]; } void gos(int i, int v) { gos(i, v, 0, 0, size); } int get(int r, int x, int lx, int rx) { if (lx >= r)return 0; if (rx <= r)return tree[x]; int mid = lx+rx>>1; return get(r, 2*x+1, lx, mid)+get(r, 2*x+2, mid, rx); } int get(int r) { return get(r, 0, 0, size); } }; struct segtree{ vector<int> tree; int size; void init(int n) { size = 1; while (size < n)size <<= 1; tree.assign(2*size-1, 0); } void gos(int i, int v, int x, int lx, int rx) { if (rx-lx==1) { tree[x] += v; return; } int mid = lx+rx>>1; if(i<mid)gos(i, v, 2*x+1, lx, mid); else gos(i, v, 2*x+2, mid, rx); tree[x] = tree[2*x+1]+tree[2*x+2]; } void gos(int i, int v) { gos(i, v, 0, 0, size); } }; int n, q, s, t; int f(int a, int b) { if (a >= b)return (a-b)*t; return (a-b)*s; } void solve() { cin >> n >> q >> s >> t; vector<int> a(n+1), b(n+1); for (auto &i: a)cin >> i; arr U; U.init(n+5); segtree st; st.init(n+5); rep(i, 1, n+1) st.gos(i, f(a[i-1], a[i])); rep(i, 0, q) { int l, r, x; cin >> l >> r >> x; b[l-1] = a[l-1]+U.get(l), b[l] = a[l]+U.get(l+1); b[r] = a[r]+U.get(r+1); if (r+1 <= n)b[r+1] = a[r+1]+U.get(r+2); int cur = st.tree[0]-f(b[l-1], b[l])-(r+1<=n?f(b[r], b[r+1]): 0ll); st.gos(l, -f(b[l-1], b[l])); if (r+1 <= n)st.gos(r+1, -f(b[r], b[r+1])); //if (i == 1)cout << "!!" <<b[r] + x<< nl; U.gos(l, x), U.gos(r+1, -x); b[l] += x; if (r != l)b[r] += x; //if (i == 1)cout << "!!" << b[r] << nl; st.gos(l, +f(b[l-1], b[l])); if (r+1 <= n)st.gos(r+1, +f(b[r], b[r+1])); cur += f(b[l-1], b[l])+(r+1<=n?f(b[r], b[r+1]): 0ll); //if (i == 1)cout << "!!" <<b[r]<< nl; cout << cur << nl; b[l] = b[l+1] = b[r] = 0; if (r+1<=n)b[r+1] = 0; } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...