焚风现象

题目描述

题目译自 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(1\leqslant i\leqslant N)i(1iN) 的海拔为 AiA_iAi​​。
地表风的温度随海拔升降而变化。地点 000 在海边,温度为 000 度;对于任一地点 i(0⩽i<N) i(0\leqslant 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)(1\leqslant j\leqslant Q)(1jQ),地点 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​​(1Lj​​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)(1\leqslant i\leqslant N+1)(1iN+1) 有一个整数 Ai−1A_{i-1}Ai1​​。
在接下来的 QQQ 行中,第 jjj 行 (1⩽j⩽Q)(1\leqslant j\leqslant Q)(1jQ) 有三个整数 Lj,Rj,XjL_j, R_j, X_jLj​​,Rj​​,Xj​​,用空格分隔。
输入的所有数的含义见题目描述。

输出格式

共 QQQ 行,第 jjj 行 (1⩽j⩽Q)(1\leqslant j\leqslant Q)(1jQ) 有一个整数,表示第 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值