萌新求助
查看原帖
萌新求助
116015
bellmanford楼主2020/5/22 23:07

这份代码,能过这道题,但是随便几个数据就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

求查错。

2020/5/22 23:07
加载中...