本人做法是整体二分,原本是直接二分答案下标的区间,这么做WA了,改成二分答案就可以了这是为什么?
WA代码
void dfs(int al,int ar,vector<int>&ask){
if(al>ar)return;
if(ask.size()==0)return;
int mid=(z[al].w+z[ar].w)/2;
int pos=0;
for(int i=al;i<=ar;i++){
if(z[i].w<=mid){
update(z[i].x,z[i].y,1);
}else{
break;
}
pos=i;
}
vector<int>dl,dr;
for(int i:ask){
if(askk(i)>=k[i]){
ans[i]=mid;
dl.push_back(i);
}else{
dr.push_back(i);
}
}
dfs(pos+1,ar,dr);
for(int i=al;i<=pos;i++){
update(z[i].x,z[i].y,-1);
}
dfs(al,pos-1,dl);
}
ac代码```cpp void dfs(int al,int ar,vector&ask){ if(al>ar)return; if(ask.size()==0)return; if(al==ar){ for(int i:ask){ ans[i]=z[al].w; } return; } int mid=z[(al+ar)/2].w; int pos=0; for(int i=al;i<=(al+ar)/2;i++){ if(z[i].w<=mid){ update(z[i].x,z[i].y,1); }else{ break; } pos=i; } vectordl,dr; for(int i:ask){ if(askk(i)>=k[i]){ ans[i]=mid; dl.push_back(i); }else{ dr.push_back(i); } } dfs(pos+1,ar,dr); for(int i=al;i<=pos;i++){ update(z[i].x,z[i].y,-1); } dfs(al,pos,dl); }