救救孩子吧,四个小时了
查看原帖
救救孩子吧,四个小时了
241817
Chancylaser楼主2021/9/25 10:11
#include<cstdio>
#include<iostream>
#include<cmath>
#define int long long
using namespace std;
int l[100005],r[100005];
int sum[100005];
int dx,sl;
int sy[100005];
int a[100005];
int la1[100005],la2[100005];
int n,m,p;
void build(){
	dx=sqrt(n);
	sl=n/dx;
	if(n%dx) sl++;
	for(int i=1;i<=sl;i++)
		l[i]=(i-1)*dx+1,r[i]=i*dx;
	r[sl]=n;
	for(int i=1;i<=sl;i++)
		for(int j=l[i];j<=r[i];j++)
			sum[i]+=a[j];
	for(int i=1;i<=n;i++)
		sy[i]=(i-1)/dx+1;
	return;
}
void add(int x,int y,int k){
	if(sy[x]==sy[y]){
		for(int i=x;i<=y;i++)
			a[i]+=k;
		sum[sy[x]]+=(y-x+1)*k;
	}
	else{
		for(int i=x;i<=r[sy[x]];i++)
			a[i]+=k;
		sum[sy[x]]+=(r[sy[x]]-x+1)*k;
		for(int i=sy[x]+1;i<=sy[y]-1;i++)
			la1[i]+=k,sum[i]+=(r[i]-l[i]+1)*k;
		for(int i=l[sy[y]];i<=y;i++)
			a[i]+=k;
		sum[sy[y]]+=(y-l[sy[y]]+1)*k;
	}
	return;
}
void mul(int x,int y,int k){
	if(sy[x]==sy[y]){
		int num=0,nu2=0;
		for(int i=x;i<=y;i++)
			num=(num+a[i]),a[i]=a[i]*k,nu2=(nu2+a[i]);
		sum[sy[x]]=(sum[sy[x]]+(nu2-num));
	}
	else{
		int num=0,nu2=0;
		for(int i=x;i<=r[sy[x]];i++)
			num=(num+a[i]),a[i]=a[i]*k,nu2=(nu2+a[i]);
		sum[sy[x]]=(sum[sy[x]]+(nu2-num));
		
		for(int i=sy[x]+1;i<=sy[y]-1;i++)
			la2[i]+=k,la1[i]=la1[i]*k,sum[i]=sum[i]*k;
			
		num=0,nu2=0;
		for(int i=l[sy[y]];i<=y;i++)
			num=(num+a[i]),a[i]=a[i]*k,nu2=(nu2+a[i]);
		sum[sy[y]]=(sum[sy[y]]+(nu2-num));
	}
	return;
}
int anwer(int x,int y){
	int ans=0;
	if(sy[x]==sy[y]){
		for(int i=x;i<=y;i++)
			ans=ans+a[i]; 
		ans=ans*la2[sy[x]]+(y-x+1)*la1[sy[x]];
	}
	else{
		for(int i=x;i<=r[sy[x]];i++)
			ans=ans+a[i];
		ans=ans*la2[sy[x]]+(r[sy[x]]-x+1)*la1[sy[x]];
		for(int i=sy[x]+1;i<=sy[y]-1;i++)
			ans=(ans+sum[i]);
		int num=0;
		for(int i=l[sy[y]];i<=y;i++)
			num+=a[i];
		ans=ans+(y-l[sy[y]]+1)*la1[sy[y]]+num*la2[sy[y]];
	}
	return ans;
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&p);
	for(int i=1;i<=n;i++)
		la2[i]=1;
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build();
	int ch;
	for(int i=1;i<=m;i++){
		scanf("%lld",&ch);
		int x,y,k;
		if(ch==1){
			scanf("%d%d%d",&x,&y,&k);
			mul(x,y,k);
		}
		if(ch==2){
			scanf("%lld%lld%lld",&x,&y,&k);
			add(x,y,k);
		}	
		if(ch==3){
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",anwer(x,y));
		}		
	}
	return 0;
}

附上第一个数据:

8 10 571373
5929 7152 8443 6028 8580 5449 8473 4237 
2 4 8 4376
1 2 8 9637
2 2 6 7918
2 5 8 5681
3 2 8
1 1 5 6482
3 1 5
1 5 8 8701
2 5 8 7992
2 5 8 7806
478836
562114

题目样例正确,但是全WA

第一个数据的第一个输出正确,第二个却错误。

加上昨晚已经四个小时了,求大佬帮帮吧

2021/9/25 10:11
加载中...