제출 #885494

#제출 시각아이디문제언어결과실행 시간메모리
885494vjudge1Foehn Phenomena (JOI17_foehn_phenomena)C++17
100 / 100
515 ms13888 KiB
#include <bits/stdc++.h> using namespace std; #define endl '\n' #define db double #define ll __int128 #define int long long #define pb push_back #define fs first #define sd second #define Mod long(1e9 + 7) #define all(x) x.begin(), x.end() #define unvisited long(-1) #define Eps double(1e-9) #define _for(i, n) for(int i = 0; i < (n); i++) #define dbg(x) cout << #x ": " << x << endl; const int Max = 1e6 + 7, Inf = 1e15 + 7; void print(bool x) { cout << (x ? "YES" : "NO") << endl; } string tostring (__int128 x) { string ans = ""; while(x > 0) { ans += (x % 10 + '0'); x /= 10; } reverse(all(ans)); return ans; } int ans = 0, n, q, s, t; int f(int a, int b) { if(a < b) return (a - b) * s; else return (a - b) * t; } struct SegmentTreeLazy { struct node { int value, lazy; node(int v = 0) { value = v; lazy = -Inf; } }; vector <node> tree; int l; void update(int v, int s, int e, int k) { if(tree[v].lazy == -Inf) tree[v].lazy = 0; tree[v].lazy += k; tree[v].value += (e - s + 1) * k; } void push(int v, int s, int e) { if (tree[v].lazy != -Inf) { int middle = (s + e) / 2; update(2 * v, s, middle, tree[v].lazy); update(2 * v + 1, middle + 1, e, tree[v].lazy); tree[v].lazy = -Inf; } } void increase(int node, int v, int x, int y, int s, int e) { if (x > e || y < s) return; if (s >= x && e <= y) { update(node, s, e, v); return; } push(node, s, e); int middle = (s + e) / 2; increase(node * 2, v, x, y, s, middle); increase(node * 2 + 1, v, x, y, middle + 1, e); tree[node].value = tree[node * 2].value + tree[node * 2 + 1].value; } void increase(int x, int y, int v) { increase(1, v, x, y, 1, l); } int sum(int node, int x, int y, int s, int e) { if (x > e || y < s) return 0; if (s >= x && e <= y) return tree[node].value; push(node, s, e); int middle = (s + e) / 2; return sum(node * 2, x, y, s, middle) + sum(node * 2 + 1, x, y, middle + 1, e); } int query(int x) { return sum(1, x, x, 1, l); } SegmentTreeLazy(int n) { for (l = 1; l < n; l = (l << 1)); tree.resize(2 * l); } }; void solve() { cin >> n >> q >> s >> t; SegmentTreeLazy St(n+2); vector <int> v(n+1); for(int i = 0; i <= n; i++) { cin >> v[i]; St.increase(i+1, i+1, v[i]); if(i != 0) ans += f(v[i-1], v[i]); } //cerr << ans << endl; while (q--) { int l, r, x, a, b, c, d; cin >> l >> r >> x; l++; r++; a = St.query(l-1), b = St.query(l), c = St.query(r), d = St.query(r+1); ans -= f(a, b); if(r != n+1) ans -= f(c, d); St.increase(l, r, x); a = St.query(l-1), b = St.query(l), c = St.query(r), d = St.query(r+1); ans += f(a, b); if(r != n+1) ans += f(c, d); cout << ans << endl; /*cout << endl; for(int i = 1; i <= n+1; i++) cout << St.query(i) << " "; break; */ } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); int Q = 1; //cin >> Q; while (Q--) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...