绝顶我为峰 @ 2020-02-27 16:16:17
qaq
这题splay可以过吗qaq
我怎么50分卡掉了
加了快读qaq
#include<iostream>
#include<cstdio>
using namespace std;
#define int long long
int ans,a[100001],m,n,tot,rt,last,fa[1100001],ch[1100001][2],cnt[1100001],val[1100001],sz[1100001];
inline int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-')
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<1)+(x<<3)+(c^48);
c=getchar();
}
return x*f;
}
inline void maintain(int x)
{
sz[x]=sz[ch[x][0]]+sz[ch[x][1]]+cnt[x];
}
inline bool get(int x)
{
return x==ch[fa[x]][1];
}
inline void clear(int x)
{
fa[x]=ch[x][0]=ch[x][1]=cnt[x]=val[x]=sz[x]=0;
}
inline void rotate(int x)
{
int y=fa[x],z=fa[y],k=get(x);
ch[y][k]=ch[x][k^1];
fa[ch[x][k^1]]=y;
ch[x][k^1]=y;
fa[y]=x;
fa[x]=z;
if(z)
ch[z][y==ch[z][1]]=x;
maintain(y);
maintain(x);
}
inline void splay(int x)
{
for(register int f=fa[x];f=fa[x],f;rotate(x))
if(fa[f])
rotate(get(x)==get(f)? f:x);
rt=x;
}
inline void insert(int k)
{
if(!rt)
{
val[++tot]=k;
cnt[tot]=1;
rt=tot;
maintain(rt);
return;
}
int node=rt,f=0;
while(1)
{
if(val[node]==k)
{
++cnt[node];
maintain(node);
maintain(f);
splay(node);
return;
}
f=node,node=ch[node][k>val[node]];
if(!node)
{
val[++tot]=k;
cnt[tot]=1;
ch[f][k>val[f]]=tot;
fa[tot]=f;
maintain(tot);
maintain(f);
splay(tot);
return;
}
}
}
inline int rk(int k)
{
int res=0,node=rt;
while(1)
{
if(k<val[node])
node=ch[node][0];
else
{
res+=sz[ch[node][0]];
if(k==val[node])
{
splay(node);
return res+1;
}
res+=cnt[node];
node=ch[node][1];
}
}
}
inline int kth(int k)
{
int node=rt;
while(1)
{
if(ch[node][0]&&k<=sz[ch[node][0]])
node=ch[node][0];
else
{
k-=sz[ch[node][0]]+cnt[node];
if(k<=0)
{
splay(node);
return val[node];
}
node=ch[node][1];
}
}
}
inline int pre()
{
int node=ch[rt][0];
while(ch[node][1])
node=ch[node][1];
return node;
}
inline int nxt()
{
int node=ch[rt][1];
while(ch[node][0])
node=ch[node][0];
return node;
}
inline void del(int k)
{
rk(k);
if(cnt[rt]>1)
{
--cnt[rt];
maintain(rt);
return;
}
if(!ch[rt][0]&&!ch[rt][1])
{
clear(rt);
rt=0;
return;
}
if(!ch[rt][0])
{
rt=ch[rt][1];
clear(fa[rt]);
fa[rt]=0;
return;
}
if(!ch[rt][1])
{
rt=ch[rt][0];
clear(fa[rt]);
fa[rt]=0;
return;
}
int p=pre(),node=rt;
splay(p);
ch[rt][1]=ch[node][1];
fa[ch[rt][1]]=rt;
clear(node);
maintain(rt);
}
signed main()
{
n=read(),m=read();
for(register int i=1;i<=n;++i)
{
a[i]=read();
insert(a[i]);
}
while(m--)
{
int opt,k;
opt=read(),k=read();
k^=last;
if(opt==1)
insert(k);
if(opt==2)
del(k);
if(opt==3)
{
insert(k);
last=rk(k);
del(k);
ans^=last;
}
if(opt==4)
{
last=kth(k);
ans^=last;
}
if(opt==5)
{
insert(k);
last=val[pre()];
ans^=last;
del(k);
}
if(opt==6)
{
insert(k);
last=val[nxt()];
ans^=last;
del(k);
}
}
printf("%lld\n",ans);
return 0;
}
by Smile_Cindy @ 2020-02-27 16:23:11
@绝顶我为峰
删除建议用这种
void erase(int x)
{
int pre=prev(x),nxt=next(x);
splay(pre);
splay(nxt,pre);
int t=ch[nxt][0];
if(cnt[t]>1)
{
cnt[t]--;
splay(t);
}
else ch[nxt][0]=0;
}
by 绝顶我为峰 @ 2020-02-27 16:23:53
@Alpha 我卡过去了,此贴完结(不是
谢谢大佬
by Sata_moto @ 2020-02-27 16:26:43
其实初始 insert 之前 sort一下原序列会快一些来着...
by hly1204 @ 2020-02-27 16:38:03
@绝顶我为峰 https://www.luogu.com.cn/record/31124066 我昨天半夜t3个点的今天就过了。。。稍微改了下
by BFqwq @ 2020-02-27 16:49:40
@绝顶我为峰 一开始直接build啊干嘛一个一个插入(
by 绝顶我为峰 @ 2020-02-27 17:03:53
@世界第一肥宅BF 懒得改了反正我会写qwq
另外大佬的树套树写得真好orz
by 谦谦君子 @ 2020-02-27 21:54:41
第一次碰见和我码风这么像的人qaq
by 谦谦君子 @ 2020-02-27 22:08:19
@绝顶我为峰 怎么卡的大佬
by 绝顶我为峰 @ 2020-02-27 22:10:54
@谦谦君子 火车头
by 谦谦君子 @ 2020-02-27 22:13:08
@绝顶我为峰 ???就是把一段代码加在代码之前是吗,能发出来吗qaq