FHQ全MLE求条
  • 板块P5350 序列
  • 楼主__assassin_
  • 当前回复6
  • 已保存回复7
  • 发布时间2025/7/26 13:22
  • 上次更新2025/7/26 19:12:08
查看原帖
FHQ全MLE求条
1457824
__assassin_楼主2025/7/26 13:22

不知道为什么会MLE

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int M=1e9+7;
struct Node{
	int ls,rs;
	int x,p;
	int size,sum;
	int tag_add,tag_change,tag_flip;
}t[600010];
int cnt,root,n,m;
int newNode(int x){
	cnt++;
	t[cnt].ls=0;
	t[cnt].rs=0;
	t[cnt].x=x;
	t[cnt].p=rand();
	t[cnt].size=1;
	t[cnt].sum=x;
	t[cnt].tag_add=0;
	t[cnt].tag_change=-1;
	t[cnt].tag_flip=0;
	return cnt;
}
int copyNode(int u){
	cnt++;
	t[cnt].ls=t[u].ls;
	t[cnt].rs=t[u].rs;
	t[cnt].x=t[u].x;
	t[cnt].p=t[u].p;
	t[cnt].size=t[u].size;
	t[cnt].sum=t[u].sum;
	t[cnt].tag_add=t[u].tag_add;
	t[cnt].tag_change=t[u].tag_change;
	t[cnt].tag_flip=t[u].tag_flip;
	return cnt;
}
void Updata(int u){
	t[u].size=t[t[u].ls].size+1+t[t[u].rs].size;
	t[u].sum=t[t[u].ls].sum+t[u].x+t[t[u].rs].sum; 
}
void addtag(int u,int x){
	t[u].x=(t[u].x+x)%M;
	t[u].sum=(t[u].sum+t[u].size*x%M)%M;
	t[u].tag_add=(t[u].tag_add+x)%M;
}
void changetag(int u,int x){
	t[u].x=x;
	t[u].sum=t[u].size*x%M;
	t[u].tag_change=x;
	t[u].tag_add=0;
//	t[u].tag_flip=0;
}
void fliptag(int u){
	t[u].tag_flip^=1;
}
void push_down(int u){
	if(t[u].tag_change!=-1){
		changetag(t[u].ls,t[u].tag_change);
		changetag(t[u].rs,t[u].tag_change);
		t[u].tag_change=-1;
	}
	if(t[u].tag_add){
		addtag(t[u].ls,t[u].tag_add);
		addtag(t[u].rs,t[u].tag_add);
		t[u].tag_add=0;
	}
	if(t[u].tag_flip){
		swap(t[u].ls,t[u].rs);
		fliptag(t[u].ls);
		fliptag(t[u].rs);
		t[u].tag_flip=0;
	}
}
void Spilt(int u,int k,int &L,int &R){
	if(u==0){
		L=R=0;
		return;
	}
	push_down(u);
	if(t[t[u].ls].size+1<=k){
		L=u;
		Spilt(t[u].rs,k-t[t[u].ls].size-1,t[u].rs,R);
	}
	else{
		R=u;
		Spilt(t[u].ls,k,L,t[u].ls);
	}
	Updata(u);
}
int Merge(int L,int R){
	if(!L||!R) return L+R;
	if(t[L].p<t[R].p){
		push_down(L);
		t[L].rs=Merge(t[L].rs,R);
		Updata(L);
		return L; 
	}
	else{
		push_down(R);
		t[R].ls=Merge(L,t[R].ls);
		Updata(R);
		return R;
	}
}
void out(int u){
	if(!u) return;
	push_down(u);
	out(t[u].ls);
	cout<<t[u].x%M<<" ";
	out(t[u].rs);
	Updata(u);
	return;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int a,L,R;
		cin>>a;
		Spilt(root,cnt,L,R);
		root=Merge(Merge(L,newNode(a)),R);
	}
	while(m--){
		int op;
		int l,r,ll,rr;
		int L,p1,mid,p2,R;
		int d;
		cin>>op;
		if(op==1){
			cin>>l>>r;
			Spilt(root,r,L,R);
			Spilt(L,l-1,L,mid);
			cout<<t[mid].sum%M<<"\n";
			root=Merge(Merge(L,mid),R);
		}
		if(op==2){
			cin>>l>>r>>d;
			Spilt(root,r,L,R);
			Spilt(L,l-1,L,mid);
			changetag(mid,d);
//			cout<<mid<<"\n";
			root=Merge(Merge(L,mid),R);
		}
		if(op==3){
			cin>>l>>r>>d;
			Spilt(root,r,L,R);
			Spilt(L,l-1,L,mid);
			addtag(mid,d);
			root=Merge(Merge(L,mid),R);
		}
		if(op==4){
			cin>>l>>r>>ll>>rr;
			int f=0;
			if(l>ll){
				f=1;
				swap(l,ll);swap(r,rr);
			}
			Spilt(root,rr,L,R);
			Spilt(L,ll-1,L,p2);
			Spilt(L,r,L,mid);
			Spilt(L,l-1,L,p1);
			if(f) p1=copyNode(p2);
			else p2=copyNode(p1);
			root=Merge(Merge(Merge(Merge(L,p1),mid),p2),R);
		}
		if(op==5){
			cin>>l>>r>>ll>>rr;
			if(l>ll){
				swap(l,ll),swap(r,rr);
			}
			Spilt(root,rr,L,R);
			Spilt(L,ll-1,L,p2);
			Spilt(L,r,L,mid);
			Spilt(L,l-1,L,p1);
			root=Merge(Merge(Merge(Merge(L,p2),mid),p1),R);
		}
		if(op==6){
			cin>>l>>r;
			Spilt(root,r,L,R);
			Spilt(L,l-1,L,mid);
			fliptag(mid);
			root=Merge(Merge(L,mid),R);
		}
//		out(root);
//		cout<<"\n";
	}
	out(root);
	return 0;
}
2025/7/26 13:22
加载中...