rt,建议添加 hack 数据:
5
5 2
5 1
5 1
5 3
2 2
正确输出应该为 1,而我的错误代码通过了所有测试点,但这组数据输出为 0。
#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
*/