焚风现象(差分模板题)

焚风现象

https://loj.ac/problem/2332

IOI 王国永远刮着海风。风从地点 000 依次吹到地点 111,地点 222 ……直到地点 NNN,共 N+1N+1N+1 个地点。JOI 君住在地点 NNN。地点 000 的海拔 A0=0A_0=0A0=0,地点 i(1⩽i⩽N)i(1leqslant ileqslant N)i(1iN) 的海拔为 AiA_iAi
地表风的温度随海拔升降而变化。地点 000 在海边,温度为 000 度;对于任一地点 i(0⩽i<N) i(0leqslant i<N)i(0i<N),从地点 iii 吹到地点 i+1i+1i+1 的风的温差仅取决于两地的海拔差。具体来说:

  • 如果 Ai=Ai+1A_i=A_{i+1}Ai=Ai+1,风的温度不变;
  • 如果 Ai<Ai+1A_i<A_{i+1}Ai<Ai+1,风每爬升 111 米,温度就会下降 SSS 度;
  • 如果 Ai>Ai+1A_i> A_{i+1}Ai>Ai+1,风每下沉 111 米,温度就会升高 TTT 度。

IOI 国的地壳运动很强烈。你得到了 QQQ 天来地壳运动的数据。在第 jjj 日 (1⩽j⩽Q)(1leqslant jleqslant Q)(1jQ),地点 Lj,Lj+1,…,Rj(1⩽Lj⩽Rj⩽N)L_j, L_j+1, ldots, R_j (1leqslant L_jleqslant R_jleqslant N)Lj,Lj+1,,Rj(1LjRjN) 的海拔升高了 XjX_jXj,注意 XjX_jXj 可能是负数。
你的任务是,计算每天地壳运动后 JOI 君住所的温度。

输入格式

第一行有四个整数 N,Q,S,T用空格分隔。
在接下来的 N+1行中,第 i 行 (1⩽i⩽N+1) 有一个整数 Ai−1
在接下来的 QQQ 行中,第 jjj 行 (1⩽j⩽Q)(1leqslant jleqslant Q)(1jQ) 有三个整数 Lj,Rj,XjL_j, R_j, X_jLj,Rj,Xj,用空格分隔。
输入的所有数的含义见题目描述。

输出格式

共 Q 行,第 j 行 (1jQ) 有一个整数,表示第 j 日地壳运动后 JOI 君住所的温度。

样例

样例输入 1

3 5 1 2
0
4
1
8
1 2 2
1 1 -2
2 3 5
1 2 -1
1 3 5

样例输出 1

-5
-7
-13
-13
-18

样例解释 1

最初,地点 0,1,2,30,1,2,30,1,2,3 的海拔分别是 0,4,1,80,4,1,80,4,1,8。第一天地壳运动后,海拔分别为 0,6,3,80,6,3,80,6,3,8。 此时,风的温度分别为 0,−6,0,−50,-6,0,-50,6,0,5。

样例输入 2

2 2 5 5
0
6
-1
1 1 4
1 2 8

样例输出 2

5
-35

样例输入 3

7 8 8 13
0
4
-9
4
-2
3
10
-9
1 4 8
3 5 -2
3 3 9
1 7 4
3 5 -1
5 6 3
4 4 9
6 7 -10

样例输出 3

277
277
322
290
290
290
290
370

 差分模板题

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 typedef long long ll;
 5 using namespace std;
 6 
 7 ll arr[200005];
 8 ll diff[200005];
 9 int n,q;
10 ll s,t;
11 
12 ll get(ll n){
13     if(n>0) return -s*n;
14     return -t*n;
15 }
16 
17 int main(){
18     scanf("%d %d %lld %lld",&n,&q,&s,&t);
19     memset(diff,0,sizeof(diff));
20     for(int i=0;i<=n;i++){
21         scanf("%lld",&arr[i]);
22     }
23     ll ans=0;
24     for(int i=1;i<=n;i++){
25         diff[i]=arr[i]-arr[i-1];
26         ans+=get(diff[i]);
27     }
28     int x,y;
29     ll v;
30     while(q--){
31         scanf("%d %d %lld",&x,&y,&v);
32         ans-=get(diff[x]);
33         diff[x]+=v;
34         ans+=get(diff[x]);
35         if(y!=n){
36             ans-=get(diff[y+1]);
37             diff[y+1]-=v;
38             ans+=get(diff[y+1]);
39         }
40         printf("%lld
",ans);
41     }
42 }
View Code
 
原文地址:https://www.cnblogs.com/Fighting-sh/p/9741854.html