题目描述
题目译自 JOI 2017 Final T1「フェーン現象 / Foehn Phenomena」
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(1⩽i⩽N) 的海拔为 AiA_iAi。
地表风的温度随海拔升降而变化。地点 000 在海边,温度为 000 度;对于任一地点 i(0⩽i<N) i(0leqslant 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)(1leqslant jleqslant Q)(1⩽j⩽Q),地点 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(1⩽Lj⩽Rj⩽N) 的海拔升高了 XjX_jXj,注意 XjX_jXj 可能是负数。
你的任务是,计算每天地壳运动后 JOI 君住所的温度。
输入格式
第一行有四个整数 N,Q,S,TN, Q, S, TN,Q,S,T,用空格分隔。
在接下来的 N+1N+1N+1 行中,第 iii 行 (1⩽i⩽N+1)(1leqslant ileqslant N+1)(1⩽i⩽N+1) 有一个整数 Ai−1A_{i-1}Ai−1。
在接下来的 QQQ 行中,第 jjj 行 (1⩽j⩽Q)(1leqslant jleqslant Q)(1⩽j⩽Q) 有三个整数 Lj,Rj,XjL_j, R_j, X_jLj,Rj,Xj,用空格分隔。
输入的所有数的含义见题目描述。
输出格式
共 QQQ 行,第 jjj 行 (1⩽j⩽Q)(1leqslant jleqslant Q)(1⩽j⩽Q) 有一个整数,表示第 jjj 日地壳运动后 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。
这道题是考试的T3,也是最后一道了(写完要歇会儿)
#include<iostream> #include<cmath> #include<algorithm> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> using namespace std; inline long long rd(){ long long x=0,f=1; char ch=getchar(); for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1; for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0'; return x*f; } inline void write(long long x){ if(x<0) putchar('-'),x=-x; if(x>9) write(x/10); putchar(x%10+'0'); return ; } long long a[1000006]; long long s[1000006]; long long T,S; long long check(long long x){ if(x>0) return x*(0-S); if(x<0) return 0-(x*T); return 0; } int main(){ long long n=rd(),m=rd(); S=rd(); T=rd(); long long ans=0; for(long long i=0;i<=n;i++){ a[i]=rd(); if(i>0) s[i]=a[i]-a[i-1]; ans+=check(s[i]); } while(m--){ long long x=rd(),y=rd(),z=rd(); s[x]+=z; ans+=(check(s[x])-check(s[x]-z)); if(y<n){ s[y+1]-=z; ans+=(check(s[y+1])-check(s[y+1]+z)); } write(ans); printf(" "); } return 0; }
考完后发现我还有不足(实在是太菜了)
很多会的题没有写出来
或许这是一次模考,但是却反映出了很多问题
离考试还有一段时间,要加油了。