想知道原因,为什么改了一点就A了
10pts 代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 200005
int n,q,s,t,a[N],c[N],x,y,z,ans;
inline int lowbit(int x){
return x&(-x);
}
void add(int i,int k){
while(i<=n){
c[i]+=k;
i+=lowbit(i);
}
}
int sum(int i){
int sum=0;
for(;i>=1;i-=lowbit(i)){
sum+=c[i];
}
return sum;
}
int Sum(int i, int j){
return sum(j)-sum(i-1);
}
int query(int i){
int ans=c[i],lca=i-lowbit(i);
i--;
while(i!=lca) {
ans-=c[i];
i-=lowbit(i);
}
return ans;
}
inline int work(int x){
return (x>0?-s*x:-t*x);
}
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
signed main() {
n=read(),q=read(),s=read(),t=read();
cin>>a[0];
ans+=work(a[0]);
for(int i=1;i<=n;i++){
a[i]=read();
//就是这里
a[i]-=a[i-1];
add(i,a[i]);
ans+=work(a[i]);
}
while(q--){
x=read(),y=read(),z=read();
int a=Sum(x,x),b=Sum(y+1,y+1);
add(x,z);
if(y!=n)add(y+1,-z);
int c=Sum(x,x),d=Sum(y+1,y+1);
ans-=work(a)-work(c);
if(y!=n)ans-=work(b)-work(d);
write(ans);
}
system("pause");
return 0;
}
AC 代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define N 200005
int n,q,s,t,a[N],c[N],x,y,z,ans;
inline int lowbit(int x){
return x&(-x);
}
void add(int i,int k){
while(i<=n){
c[i]+=k;
i+=lowbit(i);
}
}
int sum(int i){
int sum=0;
for(;i>=1;i-=lowbit(i)){
sum+=c[i];
}
return sum;
}
int Sum(int i, int j){
return sum(j)-sum(i-1);
}
int query(int i){
int ans=c[i],lca=i-lowbit(i);
i--;
while(i!=lca) {
ans-=c[i];
i-=lowbit(i);
}
return ans;
}
inline int work(int x){
return (x>0?-s*x:-t*x);
}
template<typename T=int>
inline T read(){
T X=0; bool flag=1; char ch=getchar();
while(ch<'0' || ch>'9'){if(ch=='-') flag=0; ch=getchar();}
while(ch>='0' && ch<='9') X=(X<<1)+(X<<3)+ch-'0',ch=getchar();
if(flag) return X;
return ~(X-1);
}
template<typename T=int>
inline void write(T X){
if(X<0) putchar('-'),X=~(X-1);
T s[20],top=0;
while(X) s[++top]=X%10,X/=10;
if(!top) s[++top]=0;
while(top) putchar(s[top--]+'0');
putchar('\n');
}
signed main() {
n=read(),q=read(),s=read(),t=read();
cin>>a[0];
ans+=work(a[0]);
for(int i=1;i<=n;i++){
a[i]=read();
//就是这里
add(i,a[i]-a[i-1]);
ans+=work(a[i]-a[i-1]);
}
while(q--){
x=read(),y=read(),z=read();
int a=Sum(x,x),b=Sum(y+1,y+1);
add(x,z);
if(y!=n)add(y+1,-z);
int c=Sum(x,x),d=Sum(y+1,y+1);
ans-=work(a)-work(c);
if(y!=n)ans-=work(b)-work(d);
write(ans);
}
system("pause");
return 0;
}