fhq平衡树灵异事件求助
查看原帖
fhq平衡树灵异事件求助
361932
exCat楼主2024/7/20 17:18

https://www.luogu.com.cn/record/167418203

第二个点下载后本地是对的,不知道怎么改。求各位大佬帮忙,悬关(附第二个点的数据)

#include <bits/stdc++.h>
using namespace std;
const int N=100010;
int n,tot,root,ans,cnt;
struct node
{
   int siz,ls,rs,s,rnd;
}sh[N];
inline void update(int x)
{
   sh[x].siz=sh[sh[x].ls].siz+sh[sh[x].rs].siz+1;
   return ;
}
inline int add(int v)
{
   sh[++cnt].siz=1;
   sh[cnt].s=v;
   sh[cnt].rnd=rand();
   return cnt;
}
inline void split(int &x,int &y,int now,int k)
{
   if(!now)
   {
   	x=y=0;
   	return ;
   }
   if(sh[now].s<=k)
   {
   	x=now;
   	split(sh[x].rs,y,sh[now].rs,k);
   }
   else
   {
   	y=now;
   	split(x,sh[y].ls,sh[now].ls,k);
   }
   update(now);
}
inline int merge(int x,int y)
{
   if(!x||!y) return x|y;
   if(sh[x].rnd<sh[y].rnd)
   {
   	sh[x].rs=merge(sh[x].rs,y);
   	update(x);
   	return x;
   }
   else
   {
   	sh[y].ls=merge(sh[y].ls,x);
   	update(y);
   	return y;
   }
}
inline void insert(int k)
{
   int x,y;
   split(x,y,root,k);
   root=merge(merge(x,add(k)),y); 
   return ;
}
inline int queryrank(int v)
{
   int x,y;
   split(x,y,root,v-1);
   int ans=sh[x].siz+1;
   root=merge(x,y);
   return ans;
}
inline void del(int k)
{
   int x,y,z;
   split(x,y,root,k);
   split(x,z,x,k-1);
   z=merge(sh[z].ls,sh[z].rs);
   root=merge(merge(x,z),y);
   return ;
}
inline int querykth(int x,int k)
{
   if(sh[sh[x].ls].siz>=k)
   	return querykth(sh[x].ls,k);
   else
   {
   	if(sh[sh[x].ls].siz+1==k)return x;
   	else return querykth(sh[x].rs,k-sh[sh[x].ls].siz-1);
   }
}
inline int querypre(int v)
{
   int l,r,ans;
   split(l,r,root,v-1);
   ans=sh[querykth(l,sh[l].siz)].s;
   root=merge(l,r);
   return ans;
}
inline int querysuf(int v)
{
   int l,r,ans;
   split(l,r,root,v);
   ans=sh[querykth(r,1)].s;
   root=merge(l,r);
   return ans;
}
int main()
{
   scanf("%d",&n);
   tot=root=0;
   for(int i=1;i<=n;i++)
   {
   	int opt,x;
   	scanf("%d%d",&opt,&x);
   	if(opt==1)insert(x);
   	if(opt==2)del(x);
   	if(opt==3)printf("%d\n",queryrank(x));
   	if(opt==4)printf("%d\n",sh[querykth(root,x)].s);
   	if(opt==5)printf("%d\n",querypre(x));
   	if(opt==6)printf("%d\n",querysuf(x));
   }
   return 0;
}
/*
输入:
5
1 24
1 25
1 20
3 23
3 23
输出:
2
2
*/ 
2024/7/20 17:18
加载中...