zoukankan      html  css  js  c++  java
  • 焚风现象

    题目描述

    题目译自 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(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​​(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)(1leqslant ileqslant N+1)(1iN+1) 有一个整数 Ai−1A_{i-1}Ai1​​。
    在接下来的 QQQ 行中,第 jjj 行 (1⩽j⩽Q)(1leqslant jleqslant Q)(1jQ) 有三个整数 Lj,Rj,XjL_j, R_j, X_jLj​​,Rj​​,Xj​​,用空格分隔。
    输入的所有数的含义见题目描述。

    输出格式

    共 QQQ 行,第 jjj 行 (1⩽j⩽Q)(1leqslant jleqslant 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("
    ");
        }
        return 0;
    }

    考完后发现我还有不足(实在是太菜了)

    很多会的题没有写出来

    或许这是一次模考,但是却反映出了很多问题

    离考试还有一段时间,要加油了。

    蒟蒻总是更懂你✿✿ヽ(°▽°)ノ✿
  • 相关阅读:
    oracle中 char,varchar,varchar2的区别
    .net + oracle + win2003部署遇到的问题集合
    Oracle下如何获得随机数,如何保留小数,如何取整数
    Oracle 函数大全(字符串函数,数学函数,日期函数,逻辑运算函数,其他函数)
    Service和广播联合更新UI的例子
    [python] 类常用的内置方法
    android textview 换行 "\r\n"
    java操作excel
    项目指导原则
    SVN与bugzilla整合
  • 原文地址:https://www.cnblogs.com/WWHHTT/p/9677636.html
Copyright © 2011-2022 走看看