社区讨论

样例过但全MLE求调

P5350序列参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m60g1j0p
此快照首次捕获于
2025/01/17 15:34
去年
此快照最后确认于
2025/11/04 11:27
4 个月前
查看原帖
rt和第一篇题解思路一样
CPP
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
int n,m,root,a[4000005],b[4000005],c[4000005],d1[4000005],d2[4000005],e[4000005],l[4000005],r[4000005],cnt=0,k,x,y,z,zz,p[300005];
bool d3[4000005];
int copy(int x)
{
	a[++cnt]=a[x];
	b[cnt]=b[x];
	c[cnt]=c[x];
	d1[cnt]=d1[x];
	d2[cnt]=d2[x];
	d3[cnt]=d3[x];
	e[cnt]=e[x];
	l[cnt]=l[x];
	r[cnt]=r[x];
	return cnt;
}
void pushup(int x)
{
    b[x]=(a[x]+(b[l[x]]+b[r[x]])%mod)%mod;
	c[x]=c[l[x]]+c[r[x]]+1;
}
void modify1(int x,int y)
{
	a[x]=y;
	b[x]=(long long)c[x]*y%mod;
	d1[x]=y;
	d2[x]=0;
}
void modify2(int x,int y)
{
	a[x]=(a[x]+y)%mod;
	b[x]=(b[x]+(long long)c[x]*y%mod)%mod;
	d2[x]=(d2[x]+y)%mod;
}
void modify3(int x)
{
	swap(l[x],r[x]);
	d3[x]^=1;
}
void pushdown(int x)
{
	if (d1[x]!=-1 || d2[x] || d3[x])
	{
		if (l[x])
		{
			l[x]=copy(l[x]);
			if (d1[x]!=-1)
			modify1(l[x],d1[x]);
			modify2(l[x],d2[x]);
			if (d3[x])
			modify3(l[x]);
		}
		if (r[x])
		{
			r[x]=copy(r[x]);
			if (d1[x]!=-1)
			modify1(r[x],d1[x]);
			modify2(r[x],d2[x]);
			if (d3[x])
			modify3(r[x]);
		}
		d1[x]=-1;
		d2[x]=0;
		d3[x]=0;
	}
}
int merge(int x,int y)
{
	if (x && y)
	{
		if (e[x]<e[y])
		{
			pushdown(x);
			r[x]=merge(r[x],y);
			pushup(x);
			return x;
		}
		else
		{
			pushdown(y);
			l[y]=merge(x,l[y]);
			pushup(y);
			return y;
		}
	}
	else
	return x|y;
}
void split(int x,int &y,int &z,int k)
{
	if (x)
	{
		pushdown(x);
		x=copy(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);
		}
		pushup(x);
	}
	else
	{
		y=0;
		z=0;
	}
}
int build(int ll,int rr)
{
	if (ll<=rr)
	{
		int x=++cnt,mid=ll+rr>>1;
		a[x]=p[mid];
		b[x]=a[x];
		c[x]=1;
		d1[x]=-1;
		d2[x]=0;
		d3[x]=0;
		e[x]=rand();
		l[x]=build(ll,mid-1);
		r[x]=build(mid+1,rr);
		pushup(x);
		return x;
	}
	else
	return 0;
}
int query(int num1,int num2)
{
	int x,y,z,result;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	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);
	modify1(y,num3);
	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);
	modify2(y,num3);
	root=merge(merge(x,y),z);
}
void fuzhi(int num1,int num2,int num3,int num4)
{
	int x,xx,y,zz,z;
	bool sb=0;
	if (num1>num3)
	{
		swap(num1,num3);
		sb=1;
	}
	if (num2>num4)
	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);
	if (sb)
	xx=copy(zz);
	else
	zz=copy(xx);
	root=merge(merge(merge(x,zz),y),merge(xx,z));
}
void jiaohuan(int num1,int num2,int num3,int num4)
{
	int x,xx,y,zz,z;
	if (num1>num3)
	swap(num1,num3);
	if (num2>num4)
	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 reverse(int num1,int num2)
{
	int x,y,z;
	split(root,x,z,num2);
	split(x,x,y,num1-1);
	modify3(y);
	root=merge(merge(x,y),z);
}
void dfs(int x)
{
	if (x)
	{
		pushdown(x);
		dfs(l[x]);
		p[++n]=a[x];
		dfs(r[x]);
	}
}
void print(int x)
{
	if (x)
	{
		pushdown(x);
		print(l[x]);
		cout<<a[x]<<' ';
		print(r[x]);
	}
}
int main()
{
	srand(time(nullptr));
	cin>>n>>m;
	for (int i=1;i<=n;++i)
	scanf("%d",&p[i]);
	root=build(1,n);
	for (int i=1;i<=m;++i)
	{
		scanf("%d",&k);
		if (k==1)
		{
			scanf("%d%d",&x,&y);
			cout<<query(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,&z,&zz);
			fuzhi(x,y,z,zz);
		}
		else if (k==5)
		{
			scanf("%d%d%d%d",&x,&y,&z,&zz);
			jiaohuan(x,y,z,zz);
		}
		else
		{
			scanf("%d%d",&x,&y);
			reverse(x,y);
		}
		if (cnt>3600000)
		{
			n=0;
			dfs(root);
			cnt=0;
			root=build(1,n);
		}
	}
	print(root);
}

回复

2 条回复,欢迎继续交流。

正在加载回复...