rrrrr @ 2021-01-22 12:45:14
#include<bits/stdc++.h>
using namespace std;
const double alpha=0.75;
const int maxn=1100005;
struct st
{
struct node
{
int l,r,v,vid,siz;
bool dea;
void nw(int x){l=r=0;siz=vid=1;dea=0;v=x;}
}t[maxn];
int mem[maxn];
int rt,sum,cnt,idn;
inline int bad(int o){return max((double)t[t[o].r].siz,(double)t[t[o].l].siz)>alpha*t[o].siz;}
void clear()
{
rt=sum=cnt=idn=0;
}
void upda(int o)
{
t[o].siz=t[t[o].l].siz+t[t[o].r].siz+!t[o].dea;
t[o].vid=t[t[o].l].vid+t[t[o].r].vid+!t[o].dea;
}
void dfs(int o)
{
if(!o)return;
dfs(t[o].l);
if(!t[o].dea)mem[idn++]=o;
dfs(t[o].r);
return;
}
int build(int l,int r)
{
if(l>=r) return 0;
int mid=(l+r)>>1;
int o=mem[mid];
t[o].l=build(l,mid);
t[o].r=build(mid+1,r);
upda(o);
return o;
}
inline void rebuild(int &o)
{
idn=0;
dfs(o);
o=build(0,idn);
}
void insert(int &o,int val)
{
if(!o){o=++sum;t[o].nw(val);return;}
t[o].siz++;t[o].vid++;
if(val>=t[o].v) insert(t[o].r,val);
else insert(t[o].l,val);
if(bad(o))
rebuild(o);
}
int gk(int o,int x)
{
int ans=1;
while(o)
if(t[o].v>=x) o=t[o].l;
else ans+=t[t[o].l].vid+!t[o].dea,o=t[o].r;
return ans;
}
int kth(int o,int x)
{
while(o)
{
if(!t[o].dea&&t[t[o].l].vid+1==x) {return t[o].v;}
if(t[t[o].l].vid>=x)o=t[o].l;
else x-=t[t[o].l].vid+!t[o].dea,o=t[o].r;
}
}
int dete(int o,int x)
{
if(!t[o].dea&&t[t[o].l].vid+1==x)
{
t[o].dea=1;
--t[o].vid;
return 0;
}
--t[o].vid;
if(x<=t[t[o].l].vid+!t[o].dea)dete(t[o].l,x);
else dete(t[o].r,x-t[t[o].l].vid-!t[o].dea);
}
}t;
inline int read()
{
int x=0;bool f=0;char c=getchar();
for(;!isdigit(c);c=getchar())f^=!(c^45);
for(;isdigit(c);c=getchar()) x=(x*10)+(c^48);
if(f)x=-x;return x;
}
int m,n,k,x,rt=0,lt=0,su=0;
int main()
{
//freopen("P6136_1.in","r",stdin);
t.clear();
m=read(),n=read();
for(int i=1;i<=m;i++)
{
int x=read();
t.insert(rt,x);
}
for(int i=1;i<=n;i++)
{
k=read();x=read();
x=x^lt;
if(k==1)
{
t.insert(rt,x);
}
if(k==2)
{
t.dete(rt,t.gk(rt,x));
}
if(k==3)
{
lt=t.gk(rt,x); su^=lt;
}
if(k==4)
{
lt=t.kth(rt,x);su^=lt;
}
if(k==5)
{
lt=t.kth(rt,t.gk(rt,x)-1);su^=lt;
}
if(k==6)
{
lt=t.kth(rt,t.gk(rt,x+1));su^=lt;
}
}
printf("%d",su);
}```
本地跑能过,noilinux也能过,洛谷re
P3369相同的代码也过了。
by pigstd @ 2021-01-22 12:54:28
你需要请教 @Rainbow_sjy❤OI
by _LurminShax_ @ 2021-01-22 16:32:01
@rrrrr 请剪贴板,谢谢
by rrrrr @ 2021-01-22 16:46:51
this