样例过但全WA求调
查看原帖
样例过但全WA求调
866613
sansesantongshun楼主2024/8/7 21:31
#include<bits/stdc++.h>
using namespace std;
int n,m,root=0,a[300005],b[300005],c[300005],d[300005][3],e[300005],l[300005],r[300005],k,x,y,xx,yy,z;
void pushdown(int x)
{
	if (d[x][0]!=-1)
	{
		a[x]=d[x][0];
		b[x]=d[x][0]*c[x];
		d[l[x]][0]=d[x][0];
		d[r[x]][0]=d[x][0];
		d[x][0]=-1;
	}
	if (d[x][1])
	{
		a[x]=(a[x]+d[x][1])%1000000007;
		b[x]=(b[x]+(long long)d[x][1]*c[x]%1000000007)%1000000007;
		d[l[x]][1]=(d[x][1]+d[l[x]][1])%1000000007;
		d[r[x]][1]=(d[x][1]+d[r[x]][1])%1000000007;
		d[x][1]=0;
	}
	if (d[x][2])
	{
		swap(l[x],r[x]);
		d[l[x]][2]^=1;
		d[r[x]][2]^=1;
		d[x][2]=0;
	}
}
int merge(int x,int y)
{
	if (x && y)
	{
		if (e[x]<e[y])
		{
			pushdown(x);
			r[x]=merge(r[x],y);
			b[x]=(a[x]+b[l[x]]+b[r[x]])%1000000007;
			c[x]=c[l[x]]+c[r[x]]+1;
			return x;
		}
		else
		{
			pushdown(y);
			l[y]=merge(x,l[y]);
			b[y]=(a[y]+b[l[y]]+b[r[y]])%1000000007;
			c[y]=c[l[y]]+c[r[y]]+1;
			return y;
		}
	}
	else
	return x+y;
}
void split(int x,int &y,int &z,int k)
{
	if (x)
	{
		pushdown(x);
		if (c[l[x]]<k)
		{
			y=x;
			split(r[x],r[x],z,k-c[l[x]]-1);
		}
		else
		{
			z=x;
			split(l[x],y,l[x],k);
		}
		b[x]=(a[x]+b[l[x]]+b[r[x]])%1000000007;
		c[x]=c[l[x]]+c[r[x]]+1;
	}
	else
	{
		y=0;
		z=0;
	}
}
int sum(int num1,int num2)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	int result=b[y];
	root=merge(merge(x,y),z);
	return result;
}
void cover(int num1,int num2,int num3)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	d[y][0]=num3;
	d[y][1]=0;
	root=merge(merge(x,y),z);
}
void add(int num1,int num2,int num3)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	d[y][1]=(d[y][1]+num3)%1000000007;
	root=merge(merge(x,y),z);
}
void fuzhi(int num1,int num2,int num3,int num4)
{
	int x,xx,y,zz,z;
	bool k;
	if (num1>num3)
	{
		swap(num1,num3);
		swap(num2,num4);
		k=1;
	}
	else
	k=0;
	split(root,zz,z,num4);
	split(zz,y,zz,num3-1);
	split(y,xx,y,num2);
	split(xx,x,xx,num1-1);
	if (k)
	{
		b[xx]=(b[xx]+a[zz]-a[xx]+1000000007)%1000000007;
		a[xx]=a[zz];
	}
	else
	{
		b[zz]=(b[zz]+a[xx]-a[zz]+1000000007)%1000000007;
		a[zz]=a[xx];
	}
	root=merge(merge(merge(x,xx),y),merge(zz,z));
}
void jiaohuan(int num1,int num2,int num3,int num4)
{
	int x,xx,y,zz,z;
	if (num1>num3)
	{
		swap(num1,num3);
		swap(num2,num4);
	}
	split(root,zz,z,num4);
	split(zz,y,zz,num3-1);
	split(y,xx,y,num2);
	split(xx,x,xx,num1-1);
	root=merge(merge(merge(x,zz),y),merge(xx,z));
}
void rotate(int num1,int num2)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	if (y)
	d[y][2]^=1;
	root=merge(merge(x,y),z);
}
void print(int x)
{
	pushdown(x);
	if (l[x])
	print(l[x]);
	cout<<a[x]<<' ';
	if (r[x])
	print(r[x]);
}
int main()
{
	srand(time(nullptr));
	cin>>n>>m;
	for (int i=1;i<=n;++i)
	{
		scanf("%d",&x);
		a[i]=x;
		b[i]=x;
		c[i]=1;
		d[i][0]=-1;
		e[i]=rand();
		root=merge(root,i);
	}
	while (m--)
	{
		scanf("%d",&k);
		if (k==1)
		{
			scanf("%d%d",&x,&y);
			cout<<sum(x,y)<<'\n';
		}
		else if (k==2)
		{
			scanf("%d%d%d",&x,&y,&z);
			cover(x,y,z);
		}
		else if (k==3)
		{
			scanf("%d%d%d",&x,&y,&z);
			add(x,y,z);
		}
		else if (k==4)
		{
			scanf("%d%d%d%d",&x,&y,&xx,&yy);
			fuzhi(x,y,xx,yy);
		}
		else if (k==5)
		{
			scanf("%d%d%d%d",&x,&y,&xx,&yy);
			jiaohuan(x,y,xx,yy);
		}
		else
		{
			scanf("%d%d",&x,&y);
			rotate(x,y);
		}
	}
	print(root);
}
2024/8/7 21:31
加载中...