替罪羊树求调
查看原帖
替罪羊树求调
342076
Union_of_Britain楼主2021/1/16 23:24

除了第一个点,其余要么WA要么MLE

说第二个点。 数据:

20
1 964673
5 968705
4 1
3 964673
5 965257
1 915269
1 53283
3 964673
3 53283
3 53283
1 162641
5 973984
1 948119
2 915269
2 53283
6 959161
1 531821
1 967521
2 531821
1 343410

本应输出

964673
964673
1
964673
3
1
1
964673
964673

而我的输出了

964673
964673
1
964673
3
1
1
964673
0

求助,最后一个输出为什么会是0???

#include<bits/stdc++.h>
using namespace std;
//替罪羊树
const int maxn=1e5+5;
struct Node
{
int l,r,val;
int size,fact;//fact:实际大小
bool exist;	//被删除没有
 }tzy[maxn];
 int cnt=0,root;
 void newnode(int &now,int val)
 {
 	now=++cnt;
 	tzy[now].val=val;
 	tzy[now].size=tzy[now].fact=1;
 	tzy[now].exist=true;
 }
 const double alpha=0.75;
 vector<int> v;
 bool imbalence(int now)
 {
 	if(max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>tzy[now].size*alpha||tzy[now].size-tzy[now].fact>tzy[now].size*0.3)return true;
 	return false;
 }
 void ldr(int now)
 {
 	if(!now)return ;
 	ldr(tzy[now].l);
 	if(tzy[now].exist)v.push_back(now);
 	ldr(tzy[now].r);
 }
 void lift(int l,int r,int &now)
 {
 	if(l==r)
 	{
 		tzy[now].l=tzy[now].r=0;
 		tzy[now].size=tzy[now].fact=1;
 		return ;
	 }
	 int m=(l+r)>>1;
	 while(m&&l<m&&tzy[v[m]].val==tzy[v[m-1]].val)m--;
    now=v[m];
    if(l<m)lift(l,m-1,tzy[now].l);
    else tzy[now].l=0;
    lift(m+1,r,tzy[now].r);
    tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
	tzy[now].fact=tzy[tzy[now].l].fact+tzy[tzy[now].r].fact+1;
 }
 void rebuild(int &now)
 {
 	v.clear();
 	ldr(now);
 	if(v.empty())
 	{
 		now=0;
 		return ;
	 }
	 lift(0,v.size()-1,now);
 }
 void update(int now,int end)
 {
 	if(!now)return ;
 	if(tzy[end].val<tzy[now].val)update(tzy[now].l,end);
	else update(tzy[now].r,end);
	tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
 }
 void check(int &now,int end)
 {
 	if(now==end)return ;
 	if(imbalence(now))
 	{
 		rebuild(now);
 		update(root,now);
 		return ;
	 }
	 if(tzy[end].val<tzy[now].val)check(tzy[now].l,end);
	 else check(tzy[now].r,end);
 }
 void ins(int &now,int val)
 {
 	if(!now)
 	{
 		newnode(now,val);
 		check(root,now);
 		return ;
	 }
	 tzy[now].size++;
	 tzy[now].fact++;
	 if(val<tzy[now].val)ins(tzy[now].l,val);
	 else ins(tzy[now].r,val);
 }
 void del(int now,int val)
 {
 	if(tzy[now].exist&&tzy[now].val==val)
 	{
 		tzy[now].exist=false;
 		tzy[now].fact--;
 		check(root,now);
 		return ;
	 }
	tzy[now].fact--;
	if(val<tzy[now].val)del(tzy[now].l,val);
	else del(tzy[now].r,val);
 }
 int getrank(int val)
 {
 	int now=root,rank=1;
 	while(now)
 	{
 		if(val<=tzy[now].val)now=tzy[now].l;
		else 
		{
			rank+=tzy[now].exist+tzy[tzy[now].l].fact;
			now=tzy[now].r;
		}
	 }
	 return rank;
 }
 int getnum(int rank)
 {
 	int now=root;
 	while(now)
 	{
 		if(tzy[now].exist&&tzy[tzy[now].l].fact+tzy[now].exist==rank)break;
		else if(tzy[tzy[now].l].fact>=rank)now=tzy[now].l;
		else 
		{
			rank-=tzy[tzy[now].l].fact+tzy[now].exist;
			now=tzy[now].r;	
		} 
	 }
	 return tzy[now].val;
 }
int main()
{
	//freopen("tzy.txt","r",stdin);
	int t;
	cin>>t;
	while(t--)
	{
		int opt,x;
		cin>>opt>>x;
		switch(opt)
		{
			case 1:
				ins(root,x);
				break;
			case 2:
				del(root,x);
				break;
			case 3:
				cout<<getrank(x)<<endl;
				break;
			case 4:
				cout<<getnum(x)<<endl;
				break;
			case 5:
				cout<<getnum(getrank(x)-1)<<endl;
				break;
			case 6:
				cout<<getnum(getrank(x+1))<<endl;
				break;	
		}
	}
	return 0;
}
2021/1/16 23:24
加载中...