求助分块
查看原帖
求助分块
241817
Chancylaser楼主2021/9/24 23:52
#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)*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+=a[i],a[i]*=k,nu2+=a[i];
		sum[sy[x]]+=nu2-num;
	}
	else{
		int num=0,nu2=0;
		for(int i=x;i<=r[sy[x]];i++)
			num+=a[i],a[i]*=k,nu2+=a[i];
		sum[sy[x]]+=nu2-num;
		
		for(int i=sy[x]+1;i<=sy[y]-1;i++)
			la2[i]+=k,la1[i]*=k,sum[i]*=k;
			
		num=0,nu2=0;
		for(int i=l[sy[y]];i<=y;i++)
			num+=a[i],a[i]*=k,nu2+=a[i];
		sum[sy[y]]+=nu2-num;
	}
	return;
}
long long anwer(int x,int y){
	long long ans=0;
	if(sy[x]==sy[y]){
		for(int i=x;i<=y;i++)
			ans+=(a[i]*la2[sy[i]]+la1[sy[i]])%p;
	}
	else{
		for(int i=x;i<=r[sy[x]];i++)
			ans=(ans+a[i]*la2[sy[i]]+la1[sy[i]])%p;
		for(int i=sy[x]+1;i<=sy[y]-1;i++)
			ans=(ans+sum[i])%p;
		for(int i=l[sy[y]];i<=y;i++)
			ans=(ans+a[i]*la2[sy[i]]+la1[sy[i]])%p;
	}
	return ans;
}
signed main(){
	scanf("%d%d%d",&n,&m,&p);	
	for(int i=1;i<=n;i++)
		la2[i]=1;
	for(int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	build();
	int ch;
	for(int i=1;i<=n;i++){
		scanf("%d",&ch);
		int x,y,k;
		if(ch==1){
			scanf("%d%d%d",&x,&y,&k);
			mul(x,y,k);
		}
		if(ch==2){
			scanf("%d%d%d",&x,&y,&k);
			add(x,y,k);
		}	
		if(ch==3){
			scanf("%d%d",&x,&y);
			printf("%lld\n",anwer(x,y));
		}		
	}
	return 0;
}

求助大佬,全WA。

2021/9/24 23:52
加载中...