FHQ-Treap求条,WA9个点
查看原帖
FHQ-Treap求条,WA9个点
1432246
_qumingnan_楼主2025/7/1 10:22

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q;
mt19937 rnd(chrono::system_clock::now().time_since_epoch().count());
struct node{int ls,rs,key,pri,lazy1,lazy2,size,min;}t[500005];
int cnt,root;
inline int newNode(int x){ 
	++cnt,t[cnt].key=t[cnt].min=x;
	t[cnt].pri=rnd();
	t[cnt].size=1;
	return cnt;
}
inline void Update(int u){t[u].size=t[t[u].ls].size+t[t[u].rs].size+1;t[u].min=min({t[t[u].ls].min,t[t[u].rs].min,t[u].key});}
inline void change1(int u,int x){t[u].key+=x,t[u].lazy1+=x;}
inline void change2(int u){t[u].lazy2^=1,swap(t[u].ls,t[u].rs);}
inline void push_down(int u){
	if(t[u].lazy1)change1(t[u].ls,t[u].lazy1),change1(t[u].rs,t[u].lazy1),t[u].lazy1=0;
	if(t[u].lazy2)change2(t[u].ls),change2(t[u].rs),t[u].lazy2=0;
}
inline void Split(int u,int k,int &L,int &R){
	if(u==0){L=R=0;return ;}
    push_down(u);
	if(k<=t[t[u].ls].size){
		R=u;
		Split(t[u].ls,k,L,t[u].ls);
	}
	else {
		L=u;
		Split(t[u].rs,k-t[t[u].ls].size-1,t[u].rs,R);
	}
	Update(u);
}
inline int Merge(int L,int R){
	if(!L||!R)return L+R;
	if(t[L].pri>t[R].pri){
        push_down(L);
		t[L].rs=Merge(t[L].rs,R);
		Update(L);
		return L;
	}
	else {
        push_down(R);
		t[R].ls=Merge(L,t[R].ls);
		Update(R);
		return R;
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		root=Merge(root,newNode(x));
	}
	cin>>m;
	while(m--){
		t[0].min=INT_MAX;
		string s;int x,y,z,L,R,p,pl,pr;
		cin>>s>>x;
		if(s[0]=='A'){
			cin>>y>>z;
			Split(root,y,L,R);
			Split(L,x-1,L,p);
			change1(p,z);
			root=Merge(Merge(L,p),R);
		}
		if(s=="REVERSE"){
			cin>>y;
			Split(root,y,L,R);
			Split(L,x-1,L,p);
			change2(p);
			root=Merge(Merge(L,p),R);
		}
		if(s=="REVOLVE"){
			cin>>y>>z;z%=(y-x+1);
			Split(root,y,L,R);
			Split(L,x-1,L,p);
			Split(p,y-x+1-z,pl,pr);
			root=Merge(Merge(L,Merge(pr,pl)),R);
		}
		if(s[0]=='I'){
			cin>>y;
			Split(root,x,L,R);
			root=Merge(Merge(L,newNode(y)),R);
		}
		if(s[0]=='D'){
			Split(root,x+1,L,R);
			Split(L,x,L,p);
			root=Merge(L,R);
		}
		if(s[0]=='M'){
			cin>>y;
			Split(root,y,L,R);
			Split(L,x-1,L,p);
			cout<<t[p].min<<'\n';
			root=Merge(Merge(L,p),R);
		}
	}
	return 0;
}
2025/7/1 10:22
加载中...