小穹 @ 2020-02-27 17:30:59
为什么我这个splay 第一次交T1一个点,第二次T2个点,第三次T3个点???
// splay
#include<cctype>
#include<cstdio>
using namespace std;
const int maxn=1100040;
int ff[maxn],ch[maxn][2],val[maxn],size[maxn],cnt[maxn],rot,tot,n,last,ans,m;
inline int read()
{
int sum = 0,flag = 1 ;
char ch = getchar() ;
while( !isdigit(ch) )
{
if( ch == '-' ) flag = -1 ;
ch = getchar() ;
}
while( isdigit(ch) )
sum = ( sum << 1 ) + ( sum << 3 ) + ( ch ^ 48 ) , ch = getchar() ;
return sum * flag ;
}
inline void update(int x){
size[x]=size[ch[x][0]]+size[ch[x][1]]+cnt[x];
}
inline void Rotate(int x){
int y=ff[x],z=ff[y],k=(ch[y][1]==x);
ch[z][ch[z][1]==y]=x;
ff[x]=z;
ch[y][k]=ch[x][k^1];
ff[ch[x][k^1]]=y;
ch[x][k^1]=y;
ff[y]=x;
update(y); update(x);
}
inline void splay(int x,int goal){
while(ff[x]!=goal){
int y=ff[x],z=ff[y];
if(z!=goal) (ch[z][0]==y)^(ch[y][0]==x)?Rotate(x):Rotate(y);
Rotate(x);
} if(!goal) rot=x;
}
inline void find(int x){
int u=rot;
while(ch[u][x>val[u]]!=0&&x!=val[u]) u=ch[u][x>val[u]];
splay(u,0);
}
inline void insert(int x){
int fa=0,u=rot;
while(u!=0&&x!=val[u]){
fa=u;
u=ch[u][x>val[u]];
}
if(u!=0) cnt[u]++;
else{
u=++tot;
ch[fa][x>val[fa]]=u;
val[u]=x;
ff[u]=fa;
cnt[u]=1;
size[u]=1;
}
splay(u,0);
}
inline int pre_nxt(int x,int d){
find(x); int u=rot;
if((val[u]>x&&d)||(val[u]<x&&!d)) return u;
u=ch[rot][d];
while(ch[u][d^1]!=0) u=ch[u][d^1];
return u;
}
inline void del(int x){
int xp=pre_nxt(x,0),np=pre_nxt(x,1);
splay(xp,0); splay(np,rot);
int u=ch[np][0];
if(cnt[u]>1) cnt[u]--,splay(u,0);
else ch[np][0]=0;
}
inline int getrank(int x){ find(x); return size[ch[rot][0]]+1; }
inline int getval(int x){
int u=rot;
while(40){
int l=ch[u][0];
if(size[l]>=x) u=l;
else if(size[l]+cnt[u]>=x) return val[u];
else x-=size[l]+cnt[u],u=ch[u][1];
}
}
int main()
{
n=read();m=read();
insert(1<<30),insert(-1<<30);
for(int i=1;i<=n;i++) insert(read());
while(m--)
{
int a=read(),b=read()^last;
switch(a)
{
case 1:insert(b);break;
case 2:del(b);break;
case 3:insert(b);last=getrank(b)-1;ans^=last;del(b);break;
case 4:last=getval(b+1);ans^=last;break;
case 5:last=val[pre_nxt(b,0)];ans^=last;break;
case 6:last=val[pre_nxt(b,1)];ans^=last;break;
}
}
printf("%d\n",ans);
return 0;
}
by Resonaa @ 2020-02-27 17:31:56
@张智文 评测机波动。开启 O2 优化即可AC。
by 随情英 @ 2020-02-27 17:31:58
可能评测机不稳定
by LinkCutTree @ 2020-02-27 17:32:18
标题瞩目
by 小穹 @ 2020-02-27 17:32:35
@kevinhou 这题不是自动开O2吗
by fa_555 @ 2020-02-27 17:33:10
@kevinhou 这题默认开氧(
by 风浪之子Mht @ 2020-02-27 17:35:40
標題當(bushi