sgt re 72pts 有小 hack
查看原帖
sgt re 72pts 有小 hack
964645
pies_0x楼主2025/2/7 19:20

record

deldel 函数出现 k=0k=0,初步判断为树形错误。

hack:

12
1 2701
1 3869
1 3869
1 4414
2 3869
2 3869
1 2198
1 3877
1 4078
1 3495
2 2701
2 3495
{没有输出}
#include<cstdio>
#include<algorithm>
using namespace std;

#define N 100005

const double alpha=0.6827551;
// const double alpha=1;
int q;
struct node
{
	int v,size;
	bool mydeleted;
	int deleted;
	int lson,rson;
	node():v(0),size(0),mydeleted(0),deleted(0),lson(0),rson(0){}
	node(int v):v(v),size(1),mydeleted(0),deleted(0),lson(0),rson(0){}
} tree[N];
int a[N],lena;
int root,idx;

void pushup(int k)
{
	tree[k].size=tree[tree[k].lson].size+(!tree[k].mydeleted)+tree[tree[k].rson].size;
	tree[k].deleted=tree[tree[k].lson].deleted+tree[k].mydeleted+tree[tree[k].rson].deleted;
}

void dfs(int k)
{
	if(!k)
		return;
	dfs(tree[k].lson);
	if(!tree[k].mydeleted)
		a[++lena]=k;
	dfs(tree[k].rson);
}

int rebuild(int l,int r)
{
	if(l>r)
		return 0;
	int mid=l+r>>1;
	tree[a[mid]].lson=rebuild(l,mid-1);
	tree[a[mid]].rson=rebuild(mid+1,r);
	pushup(a[mid]);
	return a[mid];
}

void mkbalance(int &k)
{
	if(alpha*tree[k].size>(double)max(tree[k].deleted,max(tree[tree[k].lson].size,tree[tree[k].rson].size)))
		return;
	lena=0;
	dfs(k);
	k=rebuild(1,lena);
}

void insert(int &k,int v)
{
	if(!k)
	{
		tree[k=++idx]=node(v);
		return;
	}
	if(v<=tree[k].v)
		insert(tree[k].lson,v);
	else
		insert(tree[k].rson,v);
	pushup(k);
	mkbalance(k);
}

void del(int &k,int v)
{
	if(!tree[k].mydeleted&&tree[k].v==v)
		tree[k].mydeleted=1;
	else if(v<=tree[k].v)
		del(tree[k].lson,v);
	else
		del(tree[k].rson,v);
	pushup(k);
	mkbalance(k);
}

bool find(int k,int v)
{
	if(!k)
		return 0;
	if(tree[k].v==v)
		return 1;
	if(v<tree[k].v)
		return find(tree[k].lson,v);
	return find(tree[k].rson,v);
}

int get_rank(int k,int v)
{
	if(!k)
		return 0;
	if(!tree[k].mydeleted&&tree[k].v==v)
		return find(tree[k].lson,v)?get_rank(tree[k].lson,v):tree[tree[k].lson].size+1;
	if(v<=tree[k].v)
		return get_rank(tree[k].lson,v);
	return tree[tree[k].lson].size+(!tree[k].mydeleted)+get_rank(tree[k].rson,v);
}

int get_kth(int k,int rank)
{
	if(!tree[k].mydeleted&&tree[tree[k].lson].size+1==rank)
		return tree[k].v;
	if(rank<=tree[tree[k].lson].size+(!tree[k].mydeleted))
		return get_kth(tree[k].lson,rank);
	return get_kth(tree[k].rson,rank-tree[tree[k].lson].size-(!tree[k].mydeleted));
}
	
signed main()
{
	freopen("P3369_9.in","r",stdin);
	freopen("P3369_9.out","w",stdout);
	// // freopen("P3369_7.out","w",stderr);
	// // freopen("P3369_7.err","w",stderr);
	// // fclose(stdout);
	// fclose(stderr);
	scanf("%d",&q);
	while(q--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int v;
			scanf("%d",&v);
			insert(root,v);
		}
		else if(op==2)
		{
			int v;
			scanf("%d\n",&v);
			del(root,v);
		}
		else if(op==3)
		{
			int v;
			scanf("%d",&v);
			bool t=find(root,v);
			if(!t)
				insert(root,v);
			printf("%d\n",get_rank(root,v));
			if(!t)
				del(root,v);
		}
		else if(op==4)
		{
			int rank;
			scanf("%d",&rank);
			printf("%d\n",get_kth(root,rank));
		}
		else if(op==5)
		{
			int v;
			scanf("%d",&v);
			bool t=find(root,v);
			if(!t)
				insert(root,v);
			printf("%d\n",get_kth(root,get_rank(root,v)-1));
			if(!t)
				del(root,v);
		}
		else
		{
			int v;
			scanf("%d",&v);
			bool t=find(root,v);
			if(!t)
				insert(root,v);
			printf("%d\n",get_kth(root,get_rank(root,v)+1));
			if(!t)
				del(root,v);
		}
	}
	return 0;
}
2025/2/7 19:20
加载中...