10pts -> AC
查看原帖
10pts -> AC
912806
hmh100211楼主2023/12/2 21:08

想知道原因,为什么改了一点就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;
}
2023/12/2 21:08
加载中...