奇了怪了
查看原帖
奇了怪了
162151
Mingxuan楼主2022/8/28 23:24

差不多的代码,为什么线段树2的板子都过了,这个题只有10分

#include<bits/stdc++.h>
#define int __int128
#define maxn 100010
using namespace std;
long long n;int m,p,op,x,y,k,block,num,a[maxn],bl[maxn],sum[1001],tag_add[1001],tag_mul[1001],l[1001],r[1001];
int read()
{
	int x=0,f=0;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=1;c=getchar();}
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	if(f) x=-x; return x;
}
void print(int x)
{
	if(x<0) putchar('-'),x=-x;
	if(x>9) print(x/10);
	putchar(x%10+'0');
}
void pushdown(int x)
{
	for(int i=l[bl[x]];i<=r[bl[x]];i++)
		a[i]=a[i]*tag_mul[bl[x]]+tag_add[bl[x]],a[i]%=p;
	tag_mul[bl[x]]=1,tag_add[bl[x]]=0;
}
void build()
{
	block=0.6*sqrt(n),num=n/block;if(n%block) num++;
	for(int i=1;i<=num;i++) l[i]=(i-1)*block+1,r[i]=i*block,tag_mul[i]=1;
	for(int i=1;i<=n;i++) bl[i]=(i-1)/block+1; r[num]=n;
	for(int i=1;i<=num;i++)
		for(int j=l[i];j<=r[i];j++)
			sum[i]+=a[j],sum[i]%=p;
}
void updata_add(int x,int y,int k)
{
	if(bl[x]==bl[y]) {pushdown(x); for(int i=x;i<=y;i++) {a[i]+=k,a[i]%=p,sum[bl[x]]+=k,sum[bl[x]]%=p; return;}}
	pushdown(x); for(int i=x;i<=r[bl[x]];i++) a[i]+=k,a[i]%=p,sum[bl[x]]+=k,sum[bl[x]]%=p;
	for(int i=bl[x]+1;i<=bl[y]-1;i++) tag_add[i]+=k,tag_add[i]%=p,sum[i]+=k*(r[i]-l[i]+1),sum[i]%=p;
	pushdown(y); for(int i=l[bl[y]];i<=y;i++) a[i]+=k,a[i]%=p,sum[bl[y]]+=k,sum[bl[y]]%=p;
}
void updata_mul(int x,int y,int k)
{
	if(bl[x]==bl[y]) {pushdown(x); for(int i=x;i<=y;i++) {sum[bl[x]]+=(k-1)*a[i],sum[bl[x]]%=p,a[i]*=k,a[i]%=p; return;}}
	pushdown(x); for(int i=x;i<=r[bl[x]];i++) sum[bl[x]]+=(k-1)*a[i],sum[bl[x]]%=p,a[i]*=k,a[i]%=p;
	for(int i=bl[x]+1;i<=bl[y]-1;i++) tag_mul[i]*=k,tag_mul[i]%=p,tag_add[i]*=k,tag_add[i]%=p,sum[i]*=k,sum[i]%=p;
	pushdown(y); for(int i=l[bl[y]];i<=y;i++) sum[bl[y]]+=(k-1)*a[i],sum[bl[y]]%=p,a[i]*=k,a[i]%=p;
}
int query(int x,int y)
{
	int ans=0;
	if(bl[x]==bl[y]) {for(int i=x;i<=y;i++) ans+=a[i]*tag_mul[bl[x]]+tag_add[bl[x]],ans%=p; return ans;}
	for(int i=x;i<=r[bl[x]];i++) ans+=a[i]*tag_mul[bl[x]]+tag_add[bl[x]],ans%=p;
	for(int i=bl[x]+1;i<=bl[y]-1;i++) ans+=sum[i],ans%=p;
	for(int i=l[bl[y]];i<=y;i++) ans+=a[i]*tag_mul[bl[y]]+tag_add[bl[y]],ans%=p;
	return ans;
}
signed main()
{
	n=read(),p=read();
	for(int i=1;i<=n;i++) a[i]=read();m=read();
	build();
	for(int i=0;i<m;i++)
	{
		op=read();
		if(op==1) x=read(),y=read(),k=read(),updata_mul(x,y,k);
		if(op==2) x=read(),y=read(),k=read(),updata_add(x,y,k);
		if(op==3) x=read(),y=read(),print(query(x,y)%p),putchar('\n');
	}
	return 0;
}
2022/8/28 23:24
加载中...