这份代码,能过这道题,但是随便几个数据就WA了。。。
因为我把这份代码套在树套树那题里头WA了。
#include<iostream>
#include<cstdio>
using namespace std;
#define max(x,y) (x>y?x:y)
#define min(x,y) (x<y?x:y)
const int M=1e5+5;
int n,m,tot=0,a[M];
int fa[M],val[M],num[M],size[M],ch[M][2];
struct Tree{
int root;
int getfa(int x){
return ch[fa[x]][0]==x||ch[fa[x]][1]==x;
}
int getson(int x){
return ch[fa[x]][1]==x;
}
void pushup(int x){
size[x]=size[ch[x][0]]+size[ch[x][1]]+num[x];
}
void rotate(int u){
int a=fa[u],b=fa[a],d1=(ch[a][1]==u),d2=(ch[b][1]==a);
int v=ch[u][d1^1];
if(getfa(a)) ch[b][d2]=u;
ch[u][d1^1]=a,ch[a][d1]=v;
if(v) fa[v]=a;
fa[a]=u,fa[u]=b;
pushup(a),pushup(u);
}
void Splay(int u,int to){
to=fa[to];
while(fa[u]!=to){
int v=fa[u];
if(fa[v]==to) rotate(u);
else if(getson(u)==getson(v)) rotate(v),rotate(u);
else rotate(u),rotate(u);
}
}
int makepoint(int v,int f){
fa[++tot]=f,val[tot]=v;
num[tot]=size[tot]=1;
return tot;
}
void insert(int x){
int now=ch[root][1];
if(ch[root][1]==0) ch[root][1]=makepoint(x,0);
else{
while(1){
size[now]++;
if(val[now]==x){
num[now]++,Splay(now,ch[root][1]);
return ;
}
int nxt=(x<val[now]?0:1);
if(!ch[now][nxt]){
ch[now][nxt]=makepoint(x,now);
Splay(ch[now][nxt],ch[root][1]);
return ;
}
now=ch[now][nxt];
}
}
}
int find(int x){
int now=ch[root][1];
while(1){
if(val[now]==x){
Splay(now,ch[root][1]);
return now;
}
int nxt=(x<val[now]?0:1);
if(!ch[now][nxt]) return 0;
now=ch[now][nxt];
}
}
void del(int x){
int pos=find(x);
if(!pos) return ;
if(num[pos]>1) num[pos]--,size[pos]--;
else{
if(!ch[pos][0]&&!ch[pos][1]) ch[root][1]=0;
else if(!ch[pos][0]) ch[root][1]=ch[pos][1],fa[ch[root][1]]=0;
else{
int left=ch[pos][0];
while(ch[left][1]) left=ch[left][1];
Splay(left,ch[pos][0]);
fa[ch[pos][1]]=left,ch[left][1]=ch[pos][1];
fa[left]=0,ch[root][1]=left;
pushup(left);
}
}
}
int rank(int x){
int pos=find(x);
return size[ch[pos][0]]+1;
}
int arank(int x){
int now=ch[root][1];
while(1){
if(size[ch[now][0]]>=x) now=ch[now][0];
else if(size[ch[now][0]]+num[now]>=x){
Splay(now,ch[root][1]);
return val[now];
}
else x-=size[ch[now][0]]+num[now],now=ch[now][1];
}
}
int lower(int x){
int now=ch[root][1],ans=-2147483647;
while(now){
if(val[now]<x&&val[now]>ans) ans=val[now];
if(x<=val[now]) now=ch[now][0];
else now=ch[now][1];
}
return ans;
}
int upper(int x){
int now=ch[root][1],ans=2147483647;
while(now){
if(val[now]>x&&val[now]<ans) ans=val[now];
if(x<val[now]) now=ch[now][0];
else now=ch[now][1];
}
return ans;
}
}tr[M<<2];
int read(){
int x=0,y=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') y=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=x*10+ch-'0';
ch=getchar();
}
return x*y;
}
int main(){
n=read();
while(n--){
int opt=read(),x=read();
if(opt==1) tr[0].insert(x);
if(opt==2) tr[0].del(x);
if(opt==3) printf("%d\n",tr[0].rank(x));
if(opt==4) printf("%d\n",tr[0].arank(x));
if(opt==5) printf("%d\n",tr[0].lower(x));
if(opt==6) printf("%d\n",tr[0].upper(x));
}
}
然后这组数据就WA了
10
1 4
1 2
1 2
1 1
1 9
1 4
1 0
1 1
1 1
3 6
答案应该是8
,然而输出是1
。
求查错。