申请加强数据
查看原帖
申请加强数据
802664
BYR_KKK楼主2024/8/7 15:24

rt,建议添加 hack 数据:

5
5 2
5 1
5 1
5 3
2 2

正确输出应该为 11,而我的错误代码通过了所有测试点,但这组数据输出为 00。

#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second

//#define file(...) freopen("##__VA_ARGS__.in","r",stdin);freopen("##__VA_ARGS__.out","w",stdout)
//#define outfile(...) freopen("##__VA_ARGS__.out","w",stdout)
//#define infile(...) freopen("##__VA_ARGS__.in","r",stdin);
//#define datafile(...) freopen("##__VA_ARGS__.in","w",stdout)
#define debug(...) fprintf(stderr,##__VA_ARGS__)
//#define printf(...) fprintf(stdout,##__VA_ARGS)
template<typename T,typename I>
#define heap(T) std::priority_queue<T>
#define umap(T,I) std::unordered_map<T,I>
#define pii(T,I) std::pair<T,I>
#define map(T,I) std::map<T,I>
#define vector(T) std::vector<T>
#define stack(T) std::stack<T>
using ll=long long;
using i128=__int128;
using ull=unsigned long long;

template<typename T>
inline void read(T &x){
	x=0;
	char c=getchar();
	int f=1;
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(int)(c-'0'),c=getchar();
	x*=f;
}

template<typename T,typename I>
void chkmin(T &a,I b){
	a=std::min(a,b);
}

template<typename T,typename I>
void chkmax(T &a,I b){
	a=std::max(a,b);
}

//随机数部分
std::mt19937 rnd(std::chrono::steady_clock::now().time_since_epoch().count());
template<typename T>
int getgen(T L,T R){
	return rnd()%(R-L+1)+L;
}

const double eps=1e-6,pi=std::acos(-1);
const int inf=1e18,MOD1=998244353,MOD2=1e9+7,MOD3=2147483579,MOD4=19198111;
const __int128 inf128=1e30;

bool Mbe;

stack(char) st;
template<typename T>
void print(T x){
	while(st.size()) st.pop();
	if(x==0) st.push('0');
	if(x<0) putchar('-'),x=-x;
	while(x) st.push((char)('0'+x%10)),x/=10;
	while(st.size()) putchar(st.top()),st.pop();
}
template<typename T>
void printsp(T x){
	print(x);
	putchar(' ');
}
template<typename T>
void println(T x){
	print(x);
	putchar('\n');
}

const int maxn=1e4+10;

int rt,tot,cnt[maxn],sz[maxn],ls[maxn],rs[maxn],val[maxn],siz[maxn],q;

namespace BST{
	void push_up(int p){
		sz[p]=1,siz[p]=cnt[p];
		if(ls[p]) sz[p]+=sz[ls[p]],siz[p]+=siz[ls[p]];
		if(rs[p]) sz[p]+=sz[rs[p]],siz[p]+=siz[rs[p]];
	}
	void insert(int &p,int x){
		if(!p) {
			p=++tot;
			sz[p]=1,cnt[p]=1,val[p]=x;
			siz[p]=1;
			return ;
		}
		if(val[p]==x) cnt[p]++,siz[p]++;
		else if(val[p]<x) insert(rs[p],x),push_up(p);
		else insert(ls[p],x),push_up(p);
		return ;
	}
	int rank(int &p,int x){
		if(!p) return 0;
		if(val[p]==x) return rank(rs[p],x)+siz[ls[p]];
		else if(val[p]>x) return rank(ls[p],x);
		else return rank(rs[p],x)+siz[ls[p]]+cnt[p];
	}
	int kth(int &p,int k){
		//小于 x 的数有 k-1 个 
		if(k<=0) return val[p];
		if(siz[ls[p]]==k-1) return val[p];
		if(siz[ls[p]]>k-1) return kth(ls[p],k);
		else return kth(rs[p],k-siz[ls[p]]-cnt[p]);
	}
	int prev(int &p,int x){
		if(!p) return -1;
		if(val[p]>=x) return prev(ls[p],x);
		else return std::max(val[p],prev(rs[p],x));
	}
	int nxtv(int &p,int x){
		if(!p) return inf;
		if(val[p]<=x) return nxtv(rs[p],x);
		else return std::min(val[p],nxtv(ls[p],x));
	}
}

using namespace BST;

bool Men;

signed main(){
//	file();
	assert(1);
	debug("%.8lfMB\n",(&Mbe-&Men)/1048576.0);
	read(q);
	while(q--){
		int opt,x;
		read(opt),read(x);
		if(opt==5) insert(rt,x);
		else if(opt==1) println(rank(rt,x)+1);
		else if(opt==2) println(kth(rt,x));
		else if(opt==3){
			int res=prev(rt,x);
			if(res==-1) println(-2147483647);
			else println(res);
		}else{
			int res=nxtv(rt,x);
			if(res==inf) println(2147483647);
			else println(res);
		}
	}
	debug("%.8lfms\n",1e3*clock()/CLOCKS_PER_SEC);
	return 0;
}
/*
Good luck
-std=c++14 -Wall -O2 -Wextra -Wl,-stack=2147483647
*/

/*
5
5 2
5 1
5 1
5 3
2 2
*/
2024/8/7 15:24
加载中...