求助本地与luogu结果不同
  • 板块灌水区
  • 楼主小小蒲公英
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/5/18 14:00
  • 上次更新2024/5/18 16:19:12
查看原帖
求助本地与luogu结果不同
392816
小小蒲公英楼主2024/5/18 14:00

treap板子
input:

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

output:

964673
964673
1
964673
3
1
1
964673
964673
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5+10;
const int inf = 1e9;
int siz[maxn],v[maxn],num[maxn],rd[maxn],son[maxn][2],cnt;
void pushup(int n){siz[n] = siz[son[n][0]] + siz[son[n][1]] + num[n]; return ;}
void rotate(int &n,int d)//d=0 left
//左旋增长左边,右旋增长右边 
{
	int tmp = son[n][d^1];
	son[n][d^1] = son[tmp][d];
	son[tmp][d] = n;
	pushup(n); pushup(tmp);
	n = tmp;
	return ;
}
void ins(int &n,int numm)
{
	if(!n)
	{
		siz[++cnt] = num[cnt] = 1;
		v[cnt] = numm; rd[cnt] = rand();
		n = cnt;
		return ;
	}
	if(v[n] == numm) { siz[n]++; num[n]++; return ; }
	int d = (numm>v[n]);
	ins(son[n][d],numm);
	if(rd[n] < rd[son[n][d]]) rotate(n,d^1);
	pushup(n);
	return ;
}
void del(int &n,int numm)
{
	if(!n) return ;
	if(v[n] != numm) { del(son[n][(numm>v[n])],numm); pushup(n); return ;}
	if(!son[n][0] && !son[n][1]) 
	{ 
		num[n]--; siz[n]--; 
		if(num[n] == 0) n=0;
	}
	if(son[n][0] && !son[n][1])
	{
		rotate(n,1);
		del(son[n][1],numm); 
	}
	if(!son[n][0] && son[n][1])
	{
		rotate(n,0);
		del(son[n][0],numm);
	}
	if(son[n][0] && son[n][1])
	{
		int d = (rd[son[n][0]] > rd[son[n][1]]);
		rotate(n,d);
		del(son[n][d],numm);
	}
	pushup(n); 
	return ;
}
int Rank(int n,int numm)
{
//	cout<<"               "<<siz[n]<<endl;
	if(!n) return 0;
	if(v[n] == numm) return siz[son[n][0]] + 1;
	if(v[n] > numm) return Rank(son[n][0],numm);
	if(v[n] < numm) return siz[son[n][0]] + num[n] + Rank(son[n][1],numm);
}
int ffind(int n,int numm)
{
	if(!n) return 0;
	if(siz[son[n][0]] >= numm) return ffind(son[n][0],numm);
	else if(siz[son[n][0]] + num[n] < numm) return ffind(son[n][1],numm - siz[son[n][0]] - num[n]);
	else return v[n];
}
int pre(int n,int numm)
{
	if(!n) return -inf;
	if(v[n] >= numm) return pre(son[n][0],numm);
	return max(v[n],pre(son[n][1],numm));
}
int suc(int n,int numm)
{
//	cout<<numm<<' '<<v[n]<<endl;
	if(!n) return inf;
	if(v[n] <= numm) return suc(son[n][1],numm);
	return min(v[n],suc(son[n][0],numm));
}
signed main() 
{
//	freopen("P3369_5.in","r",stdin);
	int n,opt,x,rt=0;
	cin>>n;
	ins(rt,-INT_MAX); ins(rt,INT_MAX);
	while(n--)
	{
		cin>>opt>>x;
		if(opt == 1) ins(rt,x);
		if(opt == 2) del(rt,x);
		if(opt == 3) { ins(rt,x); cout<<Rank(rt,x)-1<<endl; del(rt,x);}
		if(opt == 4) cout<<ffind(rt,x+1)<<endl;
		if(opt == 5) { ins(rt,x); cout<<pre(rt,x)<<endl; del(rt,x);}
		if(opt == 6) { ins(rt,x); cout<<suc(rt,x)<<endl; del(rt,x);}
	}
	return 0;
}
2024/5/18 14:00
加载中...