题目来源AtCoder
评测方式RemoteJudge
难度普及+/提高
时间限制1.00s
内存限制256.00MB
標準入力から以下の入力を読み込め.
出力は?QQ?行からなる.標準出力の?jj?行目 (1\ \leqq\ j\ \leqq\ Q1?≦?j?≦?Q) には,jj?日目の地殻変動が起こった後の JOI 君の家に吹く風の温度を出力せよ.
?
你知道N+1个地点的海拔Ai?,编号为0…N,有风从0吹向N,想让你求出地点N的风的温度.
保证A0=0
规则:
输入格式:
从标准输入中读入下面的数据.
输出格式:
输出Q行,第j行的输出代表第jj天地壳运动后JOI先生家的风的温度. (即N位置的风的温度)
用差分
上代码
?
?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
ll n,q,s,t,a[N],l[N],r[N],x[N],d[N],sum;
int main(){
cin>>n>>q>>s>>t;
for(int i=0;i<n+1;i++){
cin>>a[i];
}
for(int i=1;i<n+1;i++){
d[i]=a[i]-a[i-1];
}
for(int j=1;j<q+1;j++){
cin>>l[j]>>r[j]>>x[j];
}
for(int i=1;i<n+1;i++){
if(d[i]>0){
sum-=d[i]*s;
}else if(d[i]<0){
sum-=d[i]*t;
}
}
for(int k=1;k<q+1;k++){
if(d[l[k]]>0){
sum+=d[l[k]]*s;
}else if(d[l[k]]<0){
sum+=d[l[k]]*t;
}
d[l[k]]+=x[k];
if(d[l[k]]>0){
sum-=d[l[k]]*s;
}else if(d[l[k]]<0){
sum-=d[l[k]]*t;
}
if(r[k]==n){
cout<<sum<<endl;
continue;
}
if(d[r[k]+1]>0){
sum+=d[r[k]+1]*s;
}else if(d[r[k]+1]<0){
sum+=d[r[k]+1]*t;
}
d[r[k]+1]-=x[k];
if(d[r[k]+1]>0){
sum-=d[r[k]+1]*s;
}else if(d[r[k]+1]<0){
sum-=d[r[k]+1]*t;
}
cout<<sum<<endl;
}
return 0;
}