我感觉这两份代码没什么大区别(只有离散化时用数组或vector),为什么一个用数组的AC,用vector的WA。只有在2操作,给排名求数中出了问题(我自己跑对拍也没什么问题)而且问题出现在查询的ans为序列最大值时,getnum返回值一个为倒数第二(WA),一个为倒数第一(AC)
提供一组hack
input:
10 9
8337 16231 7816 13417 26218 3375 23410 32287 22051 21646
1 8 10 4010
4 2 7 12105
4 7 10 24643
1 10 10 17720
4 5 10 30846
3 9 22051
5 2 3 14550
4 9 10 971
2 7 9 3
output AC :
1
7816
23410
1
26218
16231
-2147483647
32287
output WA:
1
7816
23410
1
26218
16231
-2147483647
30846
数组代码:
int query_num(int l,int r,int k){
if(l==r) return l;
int sum=0;
for(int i=1;i<=cntall;i++) sum+=node[node[allno[i]].ls].val;
for(int i=1;i<=cntpre;i++) sum-=node[node[allpre[i]].ls].val;
if(k<=sum){
for(int i=1;i<=cntall;i++) allno[i]=node[allno[i]].ls;
for(int i=1;i<=cntpre;i++) allpre[i]=node[allpre[i]].ls;
return query_num(l,mid,k);
}else{
for(int i=1;i<=cntall;i++) allno[i]=node[allno[i]].rs;
for(int i=1;i<=cntpre;i++) allpre[i]=node[allpre[i]].rs;
return query_num(mid+1,r,k-sum);
}
}
int getnum(int l,int r,int k){
cntpre=cntall=0;
for(int i=r;i;i-=lowbit(i)) allno[++cntall]=rt[i];
for(int i=l-1;i;i-=lowbit(i)) allpre[++cntpre]=rt[i];
return query_num(1,len,k);
}
int main(){
//freopen("t.out","r",stdin);
//freopen("1.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>gval[i];uni[++len]=gval[i];
}
for(int i=1;i<=m;i++){
cin>>q[i].opt>>q[i].l>>q[i].r;
if(q[i].opt!=3) cin>>q[i].k;
else uni[++len]=q[i].r;
if(q[i].opt==4||q[i].opt==5) uni[++len]=q[i].k;
}
sort(uni+1,uni+1+len);
len=unique(uni+1,uni+1+len)-uni-1;//cout<<len<<" fuck CCF\n";
for(int i=1;i<=n;i++) gval[i]=lower_bound(uni+1,uni+1+len,gval[i])-uni,add(i,1);//cout<<(gval[i])<<'\n';
uni[0]=-2147483647,uni[len+1]=2147483647;
for(int i=1;i<=m;i++){
switch(q[i].opt){
case 1:cout<<getrnk(q[i].l,q[i].r,lower_bound(uni+1,uni+1+len,q[i].k)-uni)<<endl;break;
case 2:cout<<uni[getnum(q[i].l,q[i].r,q[i].k)]<<endl;break;
case 3:add(q[i].l,-1);gval[q[i].l]=lower_bound(uni+1,uni+1+len,q[i].r)-uni;add(q[i].l,1);break;
case 4:cout<<uni[getpre(q[i].l,q[i].r,lower_bound(uni+1,uni+1+len,q[i].k)-uni)]<<endl;break;
default:cout<<uni[getbck(q[i].l,q[i].r,lower_bound(uni+1,uni+1+len,q[i].k)-uni)]<<endl;break;
}
}
return 0;
}
vector代码:
int query_num(int l,int r,int k){
if(l==r) return l;
int sum=0;
for(int i=1;i<=cntall;i++) sum+=node[node[allno[i]].ls].val;
for(int i=1;i<=cntpre;i++) sum-=node[node[allpre[i]].ls].val;
if(k<=sum){
for(int i=1;i<=cntall;i++) allno[i]=node[allno[i]].ls;
for(int i=1;i<=cntpre;i++) allpre[i]=node[allpre[i]].ls;
return query_num(l,mid,k);
}else{
for(int i=1;i<=cntall;i++) allno[i]=node[allno[i]].rs;
for(int i=1;i<=cntpre;i++) allpre[i]=node[allpre[i]].rs;
return query_num(mid+1,r,k-sum);
}
}
int getnum(int l,int r,int k){
cntpre=cntall=0;
for(int i=r;i;i-=lowbit(i)) allno[++cntall]=rt[i];
for(int i=l-1;i;i-=lowbit(i)) allpre[++cntpre]=rt[i];
return query_num(1,len,k);
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>gval[i];uni.push_back(gval[i]);
}
for(int i=1;i<=m;i++){
cin>>q[i].opt>>q[i].l>>q[i].r;
if(q[i].opt!=3) cin>>q[i].k;
else uni.push_back(q[i].r);
if(q[i].opt==4||q[i].opt==5) uni.push_back(q[i].k);
}
sort(uni.begin(),uni.end());
len=unique(uni.begin(),uni.end())-uni.begin()-1;//cout<<len<<" fuck CCF\n";
for(int i=1;i<=n;i++) gval[i]=lower_bound(uni.begin(),uni.end(),gval[i])-uni.begin()+1,add(i,1);//cout<<(gval[i])<<'\n';
for(int i=1;i<=m;i++){
switch(q[i].opt){
case 1:cout<<getrnk(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)<<endl;break;
case 2:cout<<(getnum(q[i].l,q[i].r,q[i].k)-1==-1?-2147483647:uni[getnum(q[i].l,q[i].r,q[i].k)-1])<<endl;break;
case 3:add(q[i].l,-1);gval[q[i].l]=lower_bound(uni.begin(),uni.end(),q[i].r)-uni.begin()+1;add(q[i].l,1);break;
case 4:cout<<(getpre(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)-1==-1?-2147483647:uni[getpre(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)-1])<<endl;break;
default:cout<<(getbck(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)==len+1?2147483647:uni[getbck(q[i].l,q[i].r,lower_bound(uni.begin(),uni.end(),q[i].k)-uni.begin()+1)-1])<<endl;break;
}
}
return 0;
}