焚风现象(差分模板题)
焚风现象
IOI 王国永远刮着海风。风从地点 000 依次吹到地点 111,地点 222 ……直到地点 NNN,共 N+1N+1N+1 个地点。JOI 君住在地点 NNN。地点 000 的海拔 A0=0A_0=0A0=0,地点 i(1⩽i⩽N)i(1\leqslant i\leqslant N)i(1⩽i⩽N) 的海拔为 AiA_iAi。
地表风的温度随海拔升降而变化。地点 000 在海边,温度为 000 度;对于任一地点 i(0⩽i<N) i(0\leqslant i<N)i(0⩽i<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)(1\leqslant j\leqslant Q)(1⩽j⩽Q),地点 Lj,Lj+1,…,Rj(1⩽Lj⩽Rj⩽N)L_j, L_j+1, \ldots, R_j (1\leqslant L_j\leqslant R_j\leqslant N)Lj,Lj+1,…,Rj(1⩽Lj⩽Rj⩽N) 的海拔升高了 XjX_jXj,注意 XjX_jXj 可能是负数。
你的任务是,计算每天地壳运动后 JOI 君住所的温度。
输入格式
第一行有四个整数 N,Q,S,T用空格分隔。
在接下来的 N+1行中,第 i 行 (1⩽i⩽N+1) 有一个整数 Ai−1。
在接下来的 QQQ 行中,第 jjj 行 (1⩽j⩽Q)(1\leqslant j\leqslant Q)(1⩽j⩽Q) 有三个整数 Lj,Rj,XjL_j, R_j, X_jLj,Rj,Xj,用空格分隔。
输入的所有数的含义见题目描述。
输出格式
共 Q 行,第 j 行 (1⩽j⩽Q) 有一个整数,表示第 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
差分模板题
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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\n",ans); 41 } 42 }
posted on 2018-10-04 11:24 Fighting_sh 阅读(452) 评论(0) 编辑 收藏 举报