LOJ2332
-
题目
-
分析
比较神的一道题。。。
首先分析出一段区间的增加和减少不会改变 [ l , r ] [l,r] [l,r] 中的数的差值,会改变的是 a [ l ] − a [ l − 1 ] , a [ r + 1 ] − a [ r ] a[l] - a[l - 1],a[r + 1] - a[r] a[l]−a[l−1],a[r+1]−a[r] 这两个差值,先预处理出 b [ i ] = a [ i + 1 ] − a [ i ] b[i] = a[i + 1] - a[i] b[i]=a[i+1]−a[i] ,并且算出此时 n + 1 n + 1 n+1 温度 a n s ans ans ,在每次操作时,维护差值,具体: b [ l ] + = x , b [ r + 1 ] − = x b[l] += x,b[r + 1] -=x b[l]+=x,b[r+1]−=x ,不理解的模拟一下,同时更新答案 a n s ans ans ,先减去原 b [ l ] b[l] b[l] 的贡献,加上操作后的贡献 b [ l ] b[l] b[l] (
我是真的蠢) ,这么简单的加减都不会。。。(tcl) -
代码
const int N = 2e5 + 5; ll n, m, s, t, a[N], b[N]; inline ll get(ll x) { if (x > 0) return -x * s; else return x * -t; } int main () { //freopen("input.in", "r", stdin); //freopen("test.out", "w", stdout); read(n); read(m); read(s); read(t); for (int i = 1; i <= n + 1; i ++) read(a[i]); ll ans = 0; b[1] = 0; for (int i = 2; i <= n + 1; i ++) { b[i] = a[i] - a[i - 1]; ans += get(b[i]); } for (int i = 1; i <= m; i++) { ll l, r, x; read(l); read(r); read(x); l++; r++; ans -= get(b[l]); b[l] += x; ans += get(b[l]); if (r != n + 1) { ans -= get(b[r + 1]); b[r + 1] -= x; ans += get(b[r + 1]); } printf("%lld\n", ans); } return 0 ; }
-
题型
差分