Treat WA 12tps求调
查看原帖
Treat WA 12tps求调
566353
ShanLing楼主2023/7/18 23:48

应该是操作3和操作4出了问题```cpp #include <bits/stdc++.h> using namespace std; #define int long long

struct node { int l,r,x,val,cnt,sz; }tr[100005]; int n,id,root;

void push_up(int x) { tr[x].sz=tr[tr[x].l].sz+tr[tr[x].r].sz+tr[x].cnt; }

int new_node(int x) { // cout<<x<<endl; tr[++id].x=x; tr[id].val=rand(); tr[id].cnt=1; tr[id].sz=1; return id; }

void left(int &x) { int q=tr[x].r; tr[x].r=tr[q].l; tr[q].l=x;

x=q;
push_up(tr[x].l);
push_up(x);

}

void right(int &x) { int q=tr[x].l; tr[x].l=tr[q].r; tr[q].r=x;

x=q;
push_up(tr[x].r);
push_up(x);

}

void build() { root=new_node(-2147483647); tr[root].r=new_node(2147483647); push_up(1); }

void insert(int x,int &u) { if(!u) u=new_node(x);

else if(tr[u].x==x)
	tr[u].cnt++;

else
{

// cout<<tr[x]<<endl; if(tr[u].x>x) { insert(x,tr[u].l); if(tr[tr[u].l].val>tr[u].val) right(u); }

	else
	{
		insert(x,tr[u].r);
		if(tr[tr[u].r].val>tr[u].val)
			left(u);
	}
}
push_up(u);

}

void del(int x,int &u) { if(!u) return;

if(tr[u].x=x)
{
	if(tr[u].cnt>1)
	{
		tr[u].cnt--;
		push_up(u);
	}
	
	else if(tr[u].l || tr[u].r)
	{
		if(!tr[u].r || tr[tr[u].l].val>tr[tr[u].r].val)
		{
			right(u);
			del(x,tr[u].r);
		}
		
		else
		{
			left(u);
			del(x,tr[u].l);
		}
		
		push_up(u);
	}
	
	else
		u=0;
}

else
{
	if(tr[u].x<x)
		del(x,tr[u].r);
	else
		del(x,tr[u].l);
	push_up(u);
}

}

int get_rank(int x,int u) { if(!u) return 0; if(tr[u].x==x) return tr[tr[u].l].sz+1; if(tr[u].x>x) return get_rank(x,tr[u].l); return tr[tr[u].l].sz+tr[u].cnt+get_rank(x,tr[u].r); }

int get_num(int x,int u) { if(!u) return 2147483647; if(tr[tr[u].l].sz>=x) return get_num(x,tr[u].l); if(tr[tr[u].l].sz+tr[u].cnt>=x) return tr[u].x; return get_num(x-tr[tr[u].l].sz-tr[u].cnt,tr[u].r); }

int get_fr(int x,int u) { if(!u) return -2147483647; if(tr[u].x>=x) return get_fr(x,tr[u].l); else return max(get_fr(x,tr[u].r),tr[u].x); }

int get_ba(int x,int u) { if(!u) return 2147483647; if(tr[u].x<=x) return get_ba(x,tr[u].r); else return min(get_ba(x,tr[u].l),tr[u].x); }

signed main( void ) { build(); cin>>n;

for(int i=1;i<=n;i++)
{
	int opt,x;
	cin>>opt>>x;
	
	if(opt==1)
		insert(x,root);
		
	if(opt==2)
		del(x,root);
	
	if(opt==3)
		cout<<get_rank(x,root)-1<<endl;
		
	if(opt==4)
		cout<<get_num(x,root+1)<<endl;
		
	if(opt==5)
		cout<<get_fr(x,root)<<endl;
	
	if(opt==6)
		cout<<get_ba(x,root)<<endl;
}

return 0;

}

2023/7/18 23:48
加载中...