제출 #1310125

#제출 시각아이디문제언어결과실행 시간메모리
1310125arafatisticFoehn Phenomena (JOI17_foehn_phenomena)C++20
100 / 100
423 ms19652 KiB
#include <bits/stdc++.h> // #pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math,O3") // #pragma GCC optimize("Ofast") // #pragma GCC target("avx,avx2,fma") // #pragma GCC optimization("unroll-loops") // #pragma ("reroll") #define all(v) v.begin(), v.end() #define skip continue; #define gold ios_base::sync_with_stdio(false);cin.tie(NULL); #define xa "\n" #define int long long #define pb push_back #define S second #define F first using namespace std; const int mod = 1e9 + 7; const int N = 1e6 + 7; const int MAX = 1e9; const int inf = 1e18; int gcd(int a, int b) { if (b == 0) return a; else if(a == 0) return b; else return gcd(b, a % b); } int lcm(int a, int b) { return a / gcd(a, b) * b; } int n, q, s, t; int a[N]; int tree[N * 4]; int lazy[N * 4]; int temp[N]; void push(int v){ tree[v] += lazy[v]; lazy[v * 2] += lazy[v]; lazy[v * 2 + 1] += lazy[v]; lazy[v] = 0; } int get(int v, int tl, int tr, int l, int r){ push(v); if(tr < l || r < tl) return 0; if(l <= tl && tr <= r) return tree[v]; int tm = (tl + tr) / 2; return get(v * 2, tl, tm, l, r) + get(v * 2 + 1, tm + 1, tr, l, r); } void upd(int v, int tl, int tr, int l, int r, int x){ push(v); if(tr < l || r < tl) return; if(l <= tl && tr <= r){ lazy[v] += x; push(v); return; } int tm = (tl + tr) / 2; upd(v * 2, tl, tm, l, r, x); upd(v * 2 + 1, tm + 1, tr, l, r, x); } void solve() { cin >> n >> q >> s >> t; for(int i = 0; i <= n; i++){ cin >> a[i]; } int sum = 0; for(int i = 1; i <= n; i++){ if(a[i - 1] < a[i]){ temp[i] = ((a[i - 1] - a[i]) * s); } else { temp[i] = ((a[i - 1] - a[i]) * t); } sum += temp[i]; upd(1, 1, n, i, i, a[i]); } while(q--){ int l, r, x; cin >> l >> r >> x; upd(1, 1, n, l, r, x); if(r + 1 <= n){ int R = get(1, 1, n, r, r); int Rnext = get(1, 1, n, r + 1, r + 1); sum -= temp[r + 1]; if(R < Rnext){ temp[r + 1] = ((R - Rnext) * s); } else { temp[r + 1] = ((R - Rnext) * t); } sum += temp[r + 1]; } if(l == 1){ int L = get(1, 1, n, l, l); int Lprev = 0; sum -= temp[l]; if(Lprev < L){ temp[l] = ((Lprev - L) * s); } else { temp[l] = ((Lprev - L) * t); } sum += temp[l]; } if(l - 1 >= 1){ int L = get(1, 1, n, l, l); int Lprev = get(1, 1, n, l - 1, l - 1); sum -= temp[l]; if(Lprev < L){ temp[l] = ((Lprev - L) * s); } else { temp[l] = ((Lprev - L) * t); } sum += temp[l]; } // for(int i = 1; i <= n; i++){ // cout << get(1, 1, n, i, i) << ' ' << temp[i] << xa; // } cout << sum << xa; } } /* 1 2 0 4 1 8 5 7 3 0 -4 2 -5 1 -1 7 0 6 3 10 7 7 3 <- +2 -> [1, 4] 0 -6 0 -7 -1 -1 7 0 4 1 11 8 7 3 <- +3 -> [3, 4] 0 -4 2 -8 -2 0 8 0 8 1 8 5 7 3 <- +4 -> [1, 1] 0 -8 6 -1 5 3 11 */ signed main() { gold; //freopen("knight.in", "r", stdin); //freopen("knight.out", "w", stdout); int t = 1; int tt = 0; //cin >> t; while (t--) { tt++; //cout << "Case " << tt << ":" << xa; solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...