• 焚风现象(差分模板题)


    焚风现象

    https://loj.ac/problem/2332

    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(1LjRjN) 的海拔升高了 XjX_jXj,注意 XjX_jXj 可能是负数。
    你的任务是,计算每天地壳运动后 JOI 君住所的温度。

    输入格式

    第一行有四个整数 N,Q,S,T用空格分隔。
    在接下来的 N+1行中,第 i 行 (1⩽i⩽N+1) 有一个整数 Ai−1
    在接下来的 QQQ 行中,第 jjj 行 (1⩽j⩽Q)(1leqslant jleqslant Q)(1jQ) 有三个整数 Lj,Rj,XjL_j, R_j, X_jLj,Rj,Xj,用空格分隔。
    输入的所有数的含义见题目描述。

    输出格式

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

     差分模板题

     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
    ",ans);
    41     }
    42 }
    View Code
     
  • 相关阅读:
    k8s 使用 Init Container 确保依赖的服务已经启动
    asp.net core 从 3.0 到 3.1
    Github原生CI/CD,初尝Github Actions
    [nginx]编译安装及安全优化
    [nginx]盗链和防盗链场景模拟实现
    [nginx]location语法
    [nginx]站点目录及文件访问控制
    [svc]nginx限制客户端上传附件的大小
    [sql]mysql指引(整理中...)-对db的分类
    [sql]mysql参数(配置)手册
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9741854.html
Copyright © 2020-2023  润新知