题面
分析
这道题其实是差分模板qvq 区间修改 单点查询
而且题面也疯狂暗示,相邻两点海拔差,用差分简直是按照出题人意思来的,而且人性化的是n+1个点刚好n个区间,查询也只用查询第n点。
同时,知道海拔差的情况下是可以算出温度的,所以本质上这个差分数组合理也是因为可以通过前缀和倒推出温度。
所以对于每个修改,其实只有一头一尾两个点受了影响,即l-1和l的高度差影响温度和r和r+1的高度差影响温度,中间相对高度是不变的,不影响温度。
就修改这两个点就OK了.因为查询的是第n个点,其实答案可以一直累着走,修改区间的同时更新答案
代码
- #include<bits/stdc++.h>
- using namespace std;
- #define N 200020
- #define ll long long
- ll n,q,s,t,x,l,r,v,ans,last;
- ll c[N];
- template<class T>
- inline void read(T &x)
- {
- x=0;ll f=1;static char c=getchar();
- while(c<‘0‘||c>‘9‘) {if(c==‘-‘)f=-1;c=getchar();}
- while(c>=‘0‘&&c<=‘9‘){x=x*10+c-‘0‘,c=getchar();}
- x*=f;
- }
- inline ll cal(ll x){return x>0?-(x*s):-(x*t);}
- int main()
- {
- read(n);read(q);read(s);read(t);
- for(ll i=0;i<=n;i++)
- {
- read(x);
- c[i]=x-last;
- last=x;ans+=cal(c[i]);
- }
- for(ll i=1;i<=q;i++)
- {
- read(l),read(r),read(v);
- ans-=cal(c[l]),c[l]+=v,ans+=cal(c[l]);
- if(r<n)ans-=cal(c[r+1]),c[r+1]-=v,ans+=cal(c[r+1]);
- printf("%lld\n",ans);
- }
- return 0;
- }
原文地址:https://www.cnblogs.com/NSD-email0820/p/9852310.html
时间: 2024-11-04 22:13:11