【AtCoder2442】フェーン現象 (Foehn Phenomena)

题面

分析

这道题其实是差分模板qvq 区间修改 单点查询

而且题面也疯狂暗示,相邻两点海拔差,用差分简直是按照出题人意思来的,而且人性化的是n+1个点刚好n个区间,查询也只用查询第n点。

同时,知道海拔差的情况下是可以算出温度的,所以本质上这个差分数组合理也是因为可以通过前缀和倒推出温度。

所以对于每个修改,其实只有一头一尾两个点受了影响,即l-1和l的高度差影响温度和r和r+1的高度差影响温度,中间相对高度是不变的,不影响温度。

就修改这两个点就OK了.因为查询的是第n个点,其实答案可以一直累着走,修改区间的同时更新答案

 

代码

  1. #include<bits/stdc++.h>  
  2. using namespace std;  
  3. #define N 200020  
  4. #define ll long long  
  5. ll n,q,s,t,x,l,r,v,ans,last;  
  6. ll c[N];  
  7. template<class T>  
  8. inline void read(T &x)  
  9. {  
  10.     x=0;ll f=1;static char c=getchar();   
  11.     while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}  
  12.     while(c>='0'&&c<='9'){x=x*10+c-'0',c=getchar();}  
  13.     x*=f;  
  14. }   
  15. inline ll cal(ll x){return x>0?-(x*s):-(x*t);}  
  16. int main()  
  17. {  
  18.   
  19.     read(n);read(q);read(s);read(t);  
  20.     for(ll i=0;i<=n;i++)  
  21.     {  
  22.         read(x);  
  23.         c[i]=x-last;  
  24.         last=x;ans+=cal(c[i]);  
  25.     }  
  26.     for(ll i=1;i<=q;i++)  
  27.     {  
  28.         read(l),read(r),read(v);  
  29.         ans-=cal(c[l]),c[l]+=v,ans+=cal(c[l]);  
  30.         if(r<n)ans-=cal(c[r+1]),c[r+1]-=v,ans+=cal(c[r+1]);  
  31.         printf("%lld\n",ans);  
  32.     }  
  33.     return 0;  
  34. }  
posted @ 2018-10-25 19:55  WJEMail  阅读(197)  评论(0编辑  收藏  举报