求助调试,本地对拍找不出错
查看原帖
求助调试,本地对拍找不出错
142549
hbhz_zcy楼主2022/5/19 18:35
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>
using namespace std;
const int maxn=1e6+10,inf=1e9+10;
int N,a[maxn],ftop=0,root;
struct node{int l,r,v,v0,siz,cnt;}f[maxn];
int qd(){
	int rt=0,k=0;char c=getchar();
	while(c<'0'||c>'9')  c=getchar(),k|=(c=='-');
	while('0'<=c&&c<='9')  rt=(rt<<3)+(rt<<1)+c-48,c=getchar();
	return k?-rt:rt;
}
int rand32(){return (rand()<<16)|rand();}
void dfs(int t){
	printf("ask %d:l=%d r=%d v=%d v0=%d siz=%d cnt=%d\n",t,f[t].l,f[t].r,f[t].v,f[t].v0,f[t].siz,f[t].cnt);
	if(f[t].l){printf("%d->L\n",t);dfs(f[t].l);}
	if(f[t].r){printf("%d->R\n",t);dfs(f[t].r);}
}
int ins(int v){f[++ftop]=(node){0,0,v,rand32(),1,1};return ftop;}
void pushup(int t){f[t].siz=f[t].cnt+f[f[t].l].siz+f[f[t].r].siz;}
void build(){root=ins(-inf);ins(inf);f[1].r=f[1].siz=2;}
void zig(int &t){//->
	int _l=f[t].l;
	f[t].l=f[_l].r,f[_l].r=t;
	pushup(t),pushup(t=_l);
}
void zag(int &t){//<-
	int _r=f[t].r;
	f[t].r=f[_r].l,f[_r].l=t;
	pushup(t),pushup(t=_r);
}
void change1(int &t,int v){//insert
	if(!t){t=ins(v);return;}
	f[t].siz++;
	if(v==f[t].v)  f[t].cnt++;
	else if(v<f[t].v){
		change1(f[t].l,v);
		if(f[t].v0<f[f[t].l].v0)  zig(t);
	}
	else{
		change1(f[t].r,v);
		if(f[t].v0<f[f[t].r].v0)  zag(t);
	}
}
void change2(int &t,int v){//delete
	if(!t)  return;
	if(f[t].v==v){
		if(f[t].cnt>1)  f[t].cnt--;
		else if(!f[t].l||!f[t].r)  t=f[t].l+f[t].r;
		else if(f[f[t].l].v0>f[f[t].r].v0)  zig(t),change2(f[t].r,v);
		else zag(t),change2(f[t].l,v);
	}
	else change2(v<f[t].v?f[t].l:f[t].r,v);
	pushup(t);
}
int ask1(int t,int v){//value->rank
//	printf("ask %d\n",t);
	if(!t)  return 0;
	if(v<f[t].v)  return ask1(f[t].l,v);
	if(v>f[t].v)  return f[f[t].l].siz+f[t].cnt+ask1(f[t].r,v);
	return f[f[t].l].siz+1;
}
int ask2(int t,int v){//rank->value
	if(!t)  return inf;
	if(v<=f[f[t].l].siz)  return ask2(f[t].l,v);
	if(v>f[f[t].l].siz+f[t].cnt)  return ask2(f[t].r,v-f[f[t].l].siz-f[t].cnt);
	return f[t].v;
}
int ask3(int t,int v){//_v
	int rt;
	while(t){
		if(f[t].v<v)  rt=f[t].v,t=f[t].r;
		else t=f[t].l;
	}
	return rt;
}
int ask4(int t,int v){//v_
	int rt;
	while(t){
		if(f[t].v>v)  rt=f[t].v,t=f[t].l;
		else t=f[t].r;
	}
	return rt;
}
int main(){
//	freopen("in.txt","r",stdin);
//	freopen("out.txt","w",stdout);
	srand(time(0));build();
	N=qd();
	while(N--){
		int x=qd(),v=qd();
		if(x==1)  change1(root,v);
		else if(x==0)  dfs(root);
		else if(x==2)  change2(root,v);
		else if(x==3)  printf("%d\n",ask1(root,v)-1);
		else if(x==4)  printf("%d\n",ask2(root,v+1));
		else if(x==5)  printf("%d\n",ask3(root,v));
		else printf("%d\n",ask4(root,v));
	}
	return 0;
}

WA6 7 8 9 10 11

2022/5/19 18:35
加载中...