社区讨论
FHQ 56pts求调 悬3关
P6136【模板】普通平衡树(数据加强版)参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mj1dk85k
- 此快照首次捕获于
- 2025/12/11 19:48 3 个月前
- 此快照最后确认于
- 2025/12/13 18:45 3 个月前
CPP
#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<map>
#include<set>
#define int long long
#define N 3000005
using namespace std;
class FHQTreap{
public:
int root=0,idx=0;
protected:
struct node{
int l,r,val,rnd,size;
}tr[N];
inline void newnode(int &x,int v){
x=++idx;
tr[x].val=v;
tr[x].rnd=rand();
tr[x].size=1;
return ;
}
inline void pushup(int p){
tr[p].size=tr[tr[p].l].size+tr[tr[p].r].size+1;
return ;
}
void split(int p,int v,int &x,int &y){
if(!p){
x=y=0;
return ;
}
if(tr[p].val<=v){
x=p;
split(tr[x].r,v,tr[x].r,y);
pushup(x);
return ;
}else{
y=p;
split(tr[y].l,v,x,tr[y].l);
pushup(y);
return ;
}
return ;
}
int merge(int x,int y){
if(!x||!y){
return x+y;
}
if(tr[x].rnd<tr[y].rnd){
tr[x].r=merge(tr[x].r,y);
pushup(x);
return x;
}else{
tr[y].l=merge(x,tr[y].l);
pushup(y);
return y;
}
return 0;
}
public:
inline void insert(int v){
int x,y,z;
split(root,v,x,y);
newnode(z,v);
root=merge(merge(x,z),y);
return ;
}
inline void del(int v){
int x,y,z;
split(root,v,x,z);
split(x,v-1,x,y);
y=merge(tr[y].l,tr[y].r);
root=merge(merge(x,y),z);
return ;
}
inline int getrank(int v){
int x,y;
split(root,v-1,x,y);
int ans=tr[x].size+1;
root=merge(x,y);
return ans;
}
int getval(int v){
int p=root;
while(p){
if(tr[tr[p].l].size+1==v){
return tr[p].val;
}else if(tr[tr[p].l].size>=v) {
p=tr[p].l;
}else{
v-=tr[tr[p].l].size+1;
p=tr[p].r;
}
}
return 0;
}
inline int getpre(int v){
int x,y,ans;
split(root,v-1,x,y);
ans=getval(tr[x].size);
root=merge(x,y);
return ans;
}
inline int getnxt(int v){
int x,y,ans;
split(root,v,x,y);
ans=getval(1);
root=merge(x,y);
return ans;
}
};
int n,m;
int op,xp;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
FHQTreap fhq;
for(int i=1;i<=n;i++){
int x;
cin>>x;
fhq.insert(x);
}
int last=0,ans=0;
while(m--){
cin>>op>>xp;
int x=xp^last;
int res=0;
switch(op){
case 1:
fhq.insert(x);
break;
case 2:
fhq.del(x);
break;
case 3:
res=fhq.getrank(x);
last=res;
ans^=res;
break;
case 4:
res=fhq.getval(x);
last=res;
ans^=res;
break;
case 5:
res=fhq.getpre(x);
last=res;
ans^=res;
break;
default:
res=fhq.getnxt(x);
last=res;
ans^=res;
break;
}
}
cout<<ans<<'\n';
return 0;
}//FHQ 56pts求调 悬4关
回复
共 1 条回复,欢迎继续交流。
正在加载回复...