关于输入的疑问
查看原帖
关于输入的疑问
295864
eigw22h619楼主2021/12/5 13:04

输入中有求排名为1的数的前驱吗?有求排名为n+1的数的后继吗?如果有该怎么处理?

下面的源代码出现了浮点错误RE,即运行了int qq(int x)、int hj(int x) 中那两句“int cc=5/0;”

#include <bits/stdc++.h>
using namespace std;
namespace io
{
	const int L=1<<21|1;
	char ibuf[L],*iS,*iT,obuf[L],*oS=obuf,*oT=obuf+L-1,c,st[55];
	int f,tp;
	#define gc() (iS==iT?(iT=(iS=ibuf)+fread(ibuf,1,L,stdin),(iS==iT?EOF:*iS++)):*iS++)
	#define Flush() {fwrite(obuf,1,oS-obuf,stdout);oS=obuf;}
	inline void pc(char x)
	{
		*oS++=x;
		if(oS==oT)Flush();
	}
	inline void gi(int& x)
	{ //get
		for(f=1,c=gc();c<'0'||c>'9';c=gc())
		if(c=='-')f=-1;
		for(x=0;c<='9'&&c>='0';c=gc())x=(x<<3)+(x<<1)+(c&15);
		x*=f;
	}
	inline void pr(int x,char ch)
	{
		if(x<0)pc('-'),x=-x;
		tp=0;st[++tp]=x%10^'0';
		for(x/=10;x;x/=10)st[++tp]=x%10^'0';
		while(tp)pc(st[tp--]);
		pc(ch);
	}
}; // namespace io
using namespace io;
//0 ls,1 rs,2 sz
int t[63389000][3];int nds=1;
inline void ins(int x)
{
	int p=1;
	for(int i=32;i>=1;i--)
	{
		++t[p][2];
		if((x>>(i-1))&1)
		{
			if(t[p][1])p=t[p][1];
			else{t[p][1]=++nds;p=nds;}
		}
		else
		{
			if(t[p][0])p=t[p][0];
			else{t[p][0]=++nds;p=nds;}
		}
	}
	++t[p][2];
}
inline void del(int x)
{
	int p=1;
	for(int i=32;i>=1;i--)
	{
		--t[p][2];
		if((x>>(i-1))&1)p=t[p][1];
		else p=t[p][0];
	}
	--t[p][2];
}
inline int rk(int x)
{
	int p=1,ans=1;
	for(int i=32;i>=1&&p;i--)
	if((x>>(i-1))&1){ans+=t[t[p][0]][2];p=t[p][1];}
	else p=t[p][0];
	return ans;
}
inline int kth(int x)
{
	int p=1,ans=0;
	for(int i=32;i>=1;i--)
	{
		ans<<=1;
		if(x<=t[t[p][0]][2])p=t[p][0];
		else{x-=t[t[p][0]][2];ans|=1;p=t[p][1];}
	}
	return ans;
}
inline int qq(int x)
{
    int ccc=rk(x);if(ccc==1)int cc=5/0;
    return kth(ccc-1);
}
inline int hj(int x)
{
    int ccc=rk(x+1);if(ccc==t[1][2]+1)int cc=5/0;
    return kth(ccc);
}
int main()
{
	ios::sync_with_stdio(false);
	int m;gi(m);
	for(int i=1;i<=m;i++)
	{//0=ls,1=rs,2=sz
		int o,c;gi(o);gi(c);
		if(o==1)ins(c);
		else if(o==2)del(c);
		else if(o==3)pr(rk(c),'\n');
		else if(o==4)pr(kth(c),'\n');
		else if(o==5)pr(qq(c),'\n');
		else pr(hj(c),'\n');
	}
	Flush();fclose(stdout);
	return 0;
}
2021/12/5 13:04
加载中...