fhq-treap求调。
  • 板块学术版
  • 楼主ShanQing
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/11/4 23:27
  • 上次更新2023/11/5 09:45:37
查看原帖
fhq-treap求调。
368204
ShanQing楼主2023/11/4 23:27

过不了P3369样例。查了半天也没查出问题。

//writer:Oier_szc

#include <bits/stdc++.h>
//#include <windows.h>
#define TS cerr<<"I AK IOI"<<endl;
#define cr(x) cerr<<x<<endl;
#define cr2(x,y) cerr<<x<<" "<<y<<endl;
#define cr3(x,y,z) cerr<<x<<" "<<y<<" "<<z<<endl;
//#define int long long
using namespace std;
const int N=1e5+5;
int n,m;
struct node
{
	int l,r;
	int key,val,siz;
}tr[N];
int root=0,idx=0;
void pushup(int p)
{
	tr[p].siz+tr[tr[p].l].siz+tr[tr[p].r].siz+1;
}
int get_node(int key)
{
	tr[++idx].key=key;
	tr[idx].val=rand();
	tr[idx].siz=1;
	return idx;
}
int merge(int x,int y)
{
	if(!x||!y) return x|y;
	if(tr[x].val<tr[y].val)
	{
		tr[x].r=merge(tr[x].r,y),pushup(x);
		return x;
	}
	else
	{
		tr[y].l=merge(x,tr[y].l),pushup(y);
		return y;
	}
}
void split(int p,int key,int &x,int &y)
{
	if(!p) x=y=0;
	else
	{
		if(tr[p].key<=key) x=p,split(tr[p].r,key,tr[p].r,y);
		else y=p,split(tr[p].l,key,x,tr[p].l);
		pushup(p);
	}
}
void insert(int key)
{
	int x,y;
	split(root,key,x,y); 
	root=merge(merge(x,get_node(key)),y);
}
void remove(int key)
{
	int x,y,z;
	split(root,key,x,z);
	split(root,key-1,x,y);
	y=merge(tr[y].l,tr[y].r);
	root=merge(merge(x,y),z);
}
int get_key(int rt,int k)
{
	int u=rt;
	while(u)
	{
		if(tr[tr[u].l].siz>=k) u=tr[u].l;
		else if(tr[tr[u].l].siz+1==k) return tr[u].key;
		else k-=tr[tr[u].l].siz+1,u=tr[u].r;
	}
	return -1;
}
int get_rank(int key)
{
	int x,y;
	split(root,key-1,x,y);
	int res=tr[x].siz+1;
	root=merge(x,y);
	return res;
}
int get_prev(int key)
{
	int x,y;
	split(root,key-1,x,y);
	int res=get_key(x,tr[x].siz);
	root=merge(x,y);
	return res;
}
int get_next(int key)
{
	int x,y;
	split(root,key,x,y);
	int res=get_key(y,1);
	root=merge(x,y);
	return res;
}
int main()
{
	scanf("%d",&n);
	int op,x;
	while(n--)
	{
		scanf("%d%d",&op,&x);
		if(op==1) insert(x);
		else if(op==2) remove(x);
		else if(op==3) printf("%d\n",get_rank(x));
		else if(op==4) printf("%d\n",get_key(root,x));
		else if(op==5) printf("%d\n",get_prev(x));
		else if(op==6) printf("%d\n",get_next(x));
		//cr(tr[root].siz)
	}
	return 0;
}
/*

*/

2023/11/4 23:27
加载中...