求助,从第六个点开始wa
查看原帖
求助,从第六个点开始wa
498535
xiaoxiaoxiaoxiao_li楼主2022/7/17 19:38
#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int maxn=1000000;
int a[maxn],pos[maxn],l[maxn],r[maxn],sum[maxn],x,y,k,o,lazy[maxn],n,m,o1,o2;
void build(int n){
	int num=sqrt(n);
	if(n%num)num++;
	for(int i=1;i<=num;i++){
		l[i]=(i-1)*num+1;
		r[i]=i*num;
	}
	r[num]=n;
	for(int i=1;i<=num;i++){
		for(int j=l[i];j<=r[i];j++){
			pos[j]=i;
			sum[i]+=a[j];
		}
	}
}
void change(int p,int q,int v){
	int x=pos[p],y=pos[q];
	if(x==y){
		for(int i=p;i<=q;i++)
			a[i]+=v;
		sum[x]+=v*(q-p+1);
		
	}
	else{
		for(int i=x+1;i<=y-1;i++){
			lazy[i]+=v;
		}
		for(int i=p;i<=r[x];i++)
			a[i]+=v;
		sum[x]+=v*(r[x]-p+1);
		for(int i=l[y];i<=q;i++)
			a[i]+=v;
		sum[y]+=v*(q-l[y]+1);	
	}
}
int query(int p,int q)
{
	int x=pos[p],y=pos[q];
	int ans=0;
	if(x==y){
		for(int i=p;i<=q;i++){
			ans+=a[i];
			ans+=lazy[x]*(q-p+1);
		}
	}
	else {
		for(int i=x+1;i<=y-1;i++){
			ans+=sum[i]+lazy[i]*(r[i]-l[i]+1);
		}
		for(int i=p;i<=r[x];i++)
			ans+=a[i];
		ans+=lazy[x]*(r[x]-p+1);
		for(int i=l[y];i<=q;i++)
			ans+=a[i];
		ans+=lazy[y]*(q-l[y]+1);	
	}
	return ans;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(n);
	while(m--){
		cin>>o;
		if(o==1){
			cin>>o1>>o2>>k;
			change(o1,o2,k);
		}
		if(o==2){
			cin>>k;
			a[1]+=k;
			sum[pos[1]]+=k;
		}
		if(o==3){
			cin>>k;
			a[1]-=k;
			sum[pos[1]]-=k;
		}
		if(o==4){
			cin>>o1>>o2;
			cout<<query(o1,o2)<<endl;
		}
		if(o==5){
			cout<<a[1]+lazy[pos[1]]<<endl;
		}
		
	}
	return 0;
}
2022/7/17 19:38
加载中...