Treap 样例没过求调
查看原帖
Treap 样例没过求调
1062290
longlong666楼主2025/1/24 17:43
#include <bits/stdc++.h>
#define int long long
#define lid tr[id].lson
#define rid tr[id].rson
using namespace std;
const int maxn=1e6+10;
namespace treap{
	mt19937 rnd(time(0));
	struct trep{
		int lson,rson;
		int val,fixed;
		int cnt,siz;
	}tr[maxn]; int treap_cnt;
	void left_round(int &id){
		int rt=rid; rid=tr[rt].lson;
		tr[rt].lson=id; tr[rt].siz=tr[id].siz;
		tr[id].siz=tr[lid].siz+tr[rid].siz+tr[id].cnt; id=rt;
	}
	void right_round(int &id){
		int rt=lid; lid=tr[rt].rson;
		tr[rt].rson=id; tr[rt].siz=tr[id].siz;
		tr[id].siz=tr[lid].siz+tr[rid].siz+tr[id].cnt; id=rt;
	}
	bool treap_cmp(int id1,int id2){return tr[id1].fixed<tr[id2].fixed;}
	void insert(int &id,int x){
		if(id==0){
			id=++treap_cnt; tr[id].val=x; tr[id].fixed=rnd()%LLONG_MAX;
			tr[id].cnt=tr[id].siz=1; return ;
		}
		tr[id].siz++;
		if(x==tr[id].val){tr[id].cnt++; return ;}
		if(x<tr[id].val){
			insert(lid,x);
			if(treap_cmp(lid,id)) right_round(id);
		}
		else{
			insert(rid,x);
			if(treap_cmp(rid,id)) left_round(id);
		}
	}
	void erase(int &id,int x){
		if(id==0) return ;
		if(tr[id].val==x){
			if(tr[id].cnt>1){tr[id].cnt--;tr[id].siz--;return;}
			if(lid*rid==0) id=lid+rid;
			else{
				if(treap_cmp(lid,id)){right_round(id); erase(id,x);}
				else{left_round(id); erase(id,x);}
			}
		}
		else if(x<tr[id].val){tr[id].siz--; erase(lid,x);}
		else{tr[id].siz--; erase(rid,x);}
	}
	int ask_rank_pre(int id,int x){
		if(id==0) return 0;
		if(x==tr[id].val) return tr[lid].siz;
		if(x<tr[id].val) return ask_rank_pre(lid,x);
		else return tr[lid].siz+tr[id].cnt+ask_rank_pre(rid,x);
	}
	int ask_rank_nex(int id,int x){
		if(id==0) return 0;
		if(x==tr[id].val) return tr[lid].siz+tr[id].cnt;
		if(x<tr[id].val) return ask_rank_nex(lid,x);
		else return tr[lid].siz+tr[id].cnt+ask_rank_nex(rid,x);
	}
	int ask_value(int &id,int x){
		if(id==0) return 0;
		if(x<=tr[lid].siz) return ask_value(lid,x);
		else if(x<=tr[lid].siz+tr[id].cnt) return tr[id].val;
		else return ask_value(rid,x-tr[lid].siz-tr[id].cnt);
	}
}using namespace treap;
int n,m,rot;
int a[maxn];
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);int ans;
	cin>>n>>m; int op,l=0,x;  ans=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	while(m--){
		cin>>op>>x; x^=l;
		if(op==1) insert(rot,x);
		else if(op==2) erase(rot,x);
		else if(op==3) l=ask_rank_pre(rot,x)+1;
		else if(op==4) l=ask_value(rot,x);
		else if(op==5) l=ask_value(rot,ask_rank_pre(rot,x));
		else if(op==6) l=ask_value(rot,ask_rank_nex(rot,x)+1);
		if(op>=3) ans^=l;
	}cout<<ans<<endl;
	return 0;
}
2025/1/24 17:43
加载中...