焚风现象
題目描述
題目譯自?JOI 2017 Final?T1「フェーン現象?/?Foehn Phenomena」
焚風是是由于空氣作絕熱下沉運動時,因溫度升高濕度降低而形成的一種干熱風。焚風常出現在山脈背風坡,由山地引發的過山氣流在背風坡下沉,使過山氣流變得干熱的一種風。在高壓區,空氣下沉也可產生焚風。
IOI 王國永遠刮著海風。風從地點?000?依次吹到地點?111,地點?222?……直到地點?NNN,共?N+1N+1N+1?個地點。JOI 君住在地點?NNN。地點?000?的海拔?A0=0A_0=0A?0??=0,地點?i(1?i?N)i(1\leqslant i\leqslant N)i(1?i?N)?的海拔為?AiA_iA?i??。
地表風的溫度隨海拔升降而變化。地點?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}A?i??=A?i+1??,風的溫度不變;
- 如果?Ai<Ai+1A_i<A_{i+1}A?i??<A?i+1??,風每爬升?111?米,溫度就會下降?SSS?度;
- 如果?Ai>Ai+1A_i> A_{i+1}A?i??>A?i+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)L?j??,L?j??+1,…,R?j??(1?L?j???R?j???N)?的海拔升高了?XjX_jX?j??,注意?XjX_jX?j???可能是負數。
你的任務是,計算每天地殼運動后 JOI 君住所的溫度。
輸入格式
第一行有四個整數?N,Q,S,TN, Q, S, TN,Q,S,T,用空格分隔。
在接下來的?N+1N+1N+1?行中,第?iii?行?(1?i?N+1)(1\leqslant i\leqslant N+1)(1?i?N+1)?有一個整數?Ai?1A_{i-1}A?i?1??。
在接下來的?QQQ?行中,第?jjj?行?(1?j?Q)(1\leqslant j\leqslant Q)(1?j?Q)?有三個整數?Lj,Rj,XjL_j, R_j, X_jL?j??,R?j??,X?j??,用空格分隔。
輸入的所有數的含義見題目描述。
輸出格式
共?QQQ?行,第?jjj?行?(1?j?Q)(1\leqslant j\leqslant 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,也是最后一道了(寫完要歇會兒)
?
乍一眼看上去是個線段樹的板子,我考場上也就是這么寫的,然后就掛了,話說這場普及難度的考試我竟然只拿了33分(羞澀) 線段樹會卡常,慘的一批 考完后讀了一邊題,覺得有點不對,又讀了一遍,發現是個思維題,O(1)就能跑 因為居住點是固定的,而溫度只與高度的差值有關? 還有一個要注意的點就是維護的時候因為要做到O(1),所以要維護高度差,操作上本身沒有難度 下面給出代碼: #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("\n");}return 0; }考完后發現我還有不足(實在是太菜了)
很多會的題沒有寫出來
或許這是一次模考,但是卻反映出了很多問題
離考試還有一段時間,要加油了。
轉載于:https://www.cnblogs.com/WWHHTT/p/9677636.html
總結
- 上一篇: 互联网公司面试必问的mysql题目(下)
- 下一篇: POJ 3694 (tarjan缩点+L