FHQ treap WA&TLE 0pts求调
  • 板块P5350 序列
  • 楼主nnn233
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/9/25 16:56
  • 上次更新2024/9/25 20:05:44
查看原帖
FHQ treap WA&TLE 0pts求调
993065
nnn233楼主2024/9/25 16:56

尝试用讨论区的一个数据生成器和题解对拍过,没拍出错,但是提交就是测试点1~7WA,8,9,10TLE。

#include<bits/stdc++.h>
using namespace std;
const int N=2e6+10;
const int mod=1e9+7;
struct FHQtree{
	int ls,rs;
	int pri;
	int siz,v,sum,add,val,cpy,swp;
}t[N];
int sta[N+5],head;
int cnt,root;
inline int newnode(int x){
	cnt=sta[head--];
	t[cnt].siz=1;
	t[cnt].ls=t[cnt].rs=0;
	t[cnt].v=x,t[cnt].sum=x;
	t[cnt].val=-1,t[cnt].add=t[cnt].cpy=t[cnt].swp=0;
	t[cnt].pri=rand();
	return cnt;
}
inline int copy(int u){
	newnode(0);
	t[cnt]=t[u];
	return cnt;
}
inline void pushdown(int u){
	if(t[u].cpy){
		if(t[u].ls)t[u].ls=copy(t[u].ls),t[t[u].ls].cpy=1;
		if(t[u].rs)t[u].rs=copy(t[u].rs),t[t[u].rs].cpy=1;
		t[u].cpy=0;
	}
	if(t[u].swp){
		swap(t[u].ls,t[u].rs);
		if(t[u].ls)t[t[u].ls].swp^=1;
		if(t[u].rs)t[t[u].rs].swp^=1;
		t[u].swp=0;
	}
	if(t[u].val!=-1){
		if(t[u].ls){
			t[t[u].ls].sum=(1ll*t[t[u].ls].siz*t[u].val)%mod;
			t[t[u].ls].val=t[u].val%mod;
			t[t[u].ls].add=0;
			t[t[u].ls].v=t[u].val%mod;
		}
		if(t[u].rs){
			t[t[u].rs].sum=(1ll*t[t[u].rs].siz*t[u].val)%mod;
			t[t[u].rs].val=t[u].val%mod;
			t[t[u].rs].add=0;
			t[t[u].rs].v=t[u].val%mod;
		}
		t[u].val=-1;
	}
	if(t[u].add){
		if(t[u].ls){
			t[t[u].ls].sum=(1ll*t[t[u].ls].sum+t[t[u].ls].siz*t[u].add)%mod;
			t[t[u].ls].v=(1ll*t[t[u].ls].v+t[u].add)%mod;
			if(t[t[u].ls].val==-1)t[t[u].ls].add=(1ll*t[t[u].ls].add+t[u].add)%mod;
			else                  t[t[u].ls].val=(1ll*t[t[u].ls].val+t[u].add)%mod;
		}
		if(t[u].rs){
			t[t[u].rs].sum=(1ll*t[t[u].rs].sum+t[t[u].rs].siz*t[u].add)%mod;
			t[t[u].rs].v=(1ll*t[t[u].rs].v+t[u].add)%mod;
			if(t[t[u].rs].val==-1)t[t[u].rs].add=(1ll*t[t[u].rs].add+t[u].add)%mod;
			else                  t[t[u].rs].val=(1ll*t[t[u].rs].val+t[u].add)%mod;
		}
		t[u].add=0;
	}
}
inline void update(int u){
	t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz+1;
	t[u].sum=(t[t[u].ls].sum+t[t[u].rs].sum+t[u].v)%mod;
}
inline void split(int u,int x,int &L,int &R){
	if(u==0){L=R=0;return;}
	pushdown(u);
	if(t[t[u].ls].siz+1<=x)L=u,split(t[u].rs,x-t[t[u].ls].siz-1,t[u].rs,R);
	else 				   R=u,split(t[u].ls,x,L,t[u].ls);       		   
	update(u);
}
inline int merge(int L,int R){
	if(!L||!R)return L+R;
	pushdown(L),pushdown(R);
	if(t[L].pri>t[R].pri){t[L].rs=merge(t[L].rs,R),update(L);return L;}
	else                 {t[R].ls=merge(L,t[R].ls),update(R);return R;}
}
inline void inord(int u){
	if(u==0)return ;
	pushdown(u);
	inord(t[u].ls);
	cout<<t[u].v%mod<<" ";
	inord(t[u].rs);
}
int n,m,x,mini,val,ans,now,f[N];
inline void dfs(int u){
	if(!u)return ;
	pushdown(u);
	f[u]=1;
	dfs(t[u].ls);
	dfs(t[u].rs);
}
inline void cle(){
	dfs(root);
	head=0;
	for(int i=N;i>=1;--i){
		if(!f[i])sta[++head]=i;
		f[i]=0;
	}
}
int main(){
	srand(time(NULL));
	// freopen("p5350.in","r",stdin);
	// freopen("p5350.out","w",stdout);
	head=0;
	for(int i=N;i>=1;--i)sta[++head]=i;
	cin>>n>>m;
	for(int i=1;i<=n;++i){
		cin>>x;
		root=merge(root,newnode(x));
	}
	for(int i=1;i<=m;++i){
		int opt,l1,r1,l2,r2,x,L,R,M,p1,p2;
		cin>>opt;
		if(opt==1){
			cin>>l1>>r1;
			split(root,r1,L,R);
			split(L,l1-1,L,p1);
			cout<<t[p1].sum%mod<<"\n";
			root=merge(merge(L,p1),R);
		}
		if(opt==2){
			cin>>l1>>r1>>x;
			split(root,r1,L,R);
			split(L,l1-1,L,p1);
			t[p1].val=x;
			t[p1].v=x;
			t[p1].sum=(1ll*t[p1].siz*x)%mod;
			t[p1].add=0;
			root=merge(merge(L,p1),R);
		}
		if(opt==3){
			cin>>l1>>r1>>x;
			split(root,r1,L,R);
			split(L,l1-1,L,p1);
			t[p1].v=(1ll*t[p1].v+x)%mod;
			t[p1].sum=(1ll*t[p1].sum+t[p1].siz*x)%mod;
			if(t[p1].val==-1)t[p1].add=(1ll*t[p1].add+x)%mod;
			else t[p1].val=(1ll*t[p1].val+x)%mod;
			root=merge(merge(L,p1),R);
		}
		if(opt==4){
			cin>>l1>>r1>>l2>>r2;
			split(root,max(r1,r2),L,R);
			split(L,max(l1,l2)-1,L,p2);
			split(L,min(r1,r2),L,M);
			split(L,min(l1,l2)-1,L,p1);
			if(l1<l2)t[p2]=t[p1];
			if(l1>l2)t[p1]=t[p2];
			t[p2].cpy=1;
			t[p1].cpy=1;
			root=merge(merge(merge(merge(L,p1),M),p2),R);
		}
		if(opt==5){
			cin>>l1>>r1>>l2>>r2;
			if(l1>l2)swap(l1,l2),swap(r1,r2);
			split(root,r2,L,R);
			split(L,l2-1,L,p2);
			split(L,r1,L,M);
			split(L,l1-1,L,p1);
			root=merge(merge(merge(merge(L,p2),M),p1),R);
			
		}
		if(opt==6){
			cin>>l1>>r1;
			split(root,r1,L,R);
			split(L,l1-1,L,p1);
			t[p1].swp^=1;
			root=merge(merge(L,p1),R);
		}
		if(head<=n)cle();
	}
	inord(root);
	return 0;
}
2024/9/25 16:56
加载中...