是的,你没有看错,所有数据都过了但是样例没过
但是假如样例会输出3 3 1 5,第一行应该是2
感觉是函数GetRankByVal有问题,代码大概是参照李煜东的蓝书的,但是输出时write(GetRankByVal(root,x));
而不是write(GetRankByVal(root,x)-1);
书上写的大概是后面的
总的代码
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
const int INF=2147483647;
void read(int &x){
x=0;int f=1;
char ch=getchar();
while (ch<'0'||ch>'9'){
if (ch=='-') f=-1;
ch=getchar();
}
while (ch>='0'&&ch<='9'){
x=x*10+(ch^48);
ch=getchar();
}
x*=f;
}
void write(int x){
if (x<0){
putchar('-');
x=-x;
}
if (x>9) write(x/10);
putchar(x%10+'0');
}
struct node{
int l,r,val,dat,cnt,siz;
};
node a[100005];
#define l(p) a[p].l
#define r(p) a[p].r
#define val(p) a[p].val
#define dat(p) a[p].dat
#define cnt(p) a[p].cnt
#define siz(p) a[p].siz
int root,tot;
int New(int val){
++tot;
val(tot)=val;
dat(tot)=rand();
cnt(tot)=siz(tot)=1;
return tot;
}
void update(int p){
siz(p)=siz(l(p))+siz(r(p))+cnt(p);
}
void Build(){
root=New(INF);l(root)=New(-INF);
update(root);
}
int GetRankByVal(int p,int val){
if (p==0) return 0;
if (val(p)==val) return siz(l(p))+1;
if (val(p)>val) return GetRankByVal(l(p),val);
return GetRankByVal(r(p),val)+siz(l(p))+cnt(p);
}
int GetValByRank(int p,int rank){
if (p==0) return INF;
if (siz(l(p))>=rank) return GetValByRank(l(p),rank);
if (siz(l(p))+cnt(p)>=rank) return val(p);
return GetValByRank(r(p),rank-siz(l(p))-cnt(p));
}
void zig(int &p){//右旋
int q=l(p);
l(p)=r(q);r(q)=p;p=q;
update(r(p));update(p);
}
void zag(int &p){//左旋
int q=r(p);
r(p)=l(q);l(q)=p;p=q;
update(l(p));update(p);
}
void Insert(int &p,int val){
if (p==0){
p=New(val);
return;
}
if (val(p)==val){
++cnt(p);
update(p);
return;
}
if (val(p)>val){
Insert(l(p),val);
if (dat(p)<dat(l(p))) zig(p);
}
else{
Insert(r(p),val);
if (dat(p)<dat(r(p))) zag(p);
}
update(p);
}
int GetPre(int val){
int ans=2;//val(2)=-INF
int p=root;
while (p){
if (val==val(p)){
if (l(p)){
p=l(p);
while (r(p)) p=r(p);
ans=p;
}
break;
}
if (val(p)<val&&val(p)>val(ans)) ans=p;
p=val<val(p)?l(p):r(p);
}
return val(ans);
}
int GetNext(int val){
int ans=1;//val(1)=INF
int p=root;
while (p){
if (val==val(p)){
if (r(p)){
p=r(p);
while (l(p)) p=l(p);
ans=p;
}
break;
}
if (val(p)>val&&val(p)<val(ans)) ans=p;
p=val<val(p)?l(p):r(p);
}
return val(ans);
}
int main(){
srand(unsigned(time(0)));
int t,opt,x;
read(t);
Build();
while (t--){
read(opt);read(x);
switch(opt){
case 1:
write(GetRankByVal(root,x));
putchar('\n');
break;
case 2:
write(GetValByRank(root,x+1));
putchar('\n');
break;
case 3:
write(GetPre(x));
putchar('\n');
break;
case 4:
write(GetNext(x));
putchar('\n');
break;
case 5:
Insert(root,x);
break;
}
}
return 0;
}