F2. Guess the K-th Zero (Hard version)

查询第k个0  t 1e4

n 2e5,提问上限6e4

 

线段树保存改变影响

struct node{
    int l,r,val;//0的个数 
}tr[N<<2];
void build(int o,int l,int r){
    tr[o].l=l,tr[o].r=r;tr[o].val=-1;
    if(l==r)    return ;
    int mid=l+r>>1;
    build(o<<1,l,mid);
    build(o<<1|1,mid+1,r);
}
void change(int o,int k){
    if(tr[o].val>0)    --tr[o].val;
    if(tr[o].l==tr[o].r)    return ;
    int mid=tr[o].l+tr[o].r>>1;
    if(mid<k)    change(o<<1|1,k);
    else        change(o<<1,k);
}
int query(int o){
    if(tr[o].val==-1){
        cout<<"? "<<tr[o].l<<" "<<tr[o].r<<endl;
        cin>>tr[o].val;tr[o].val=tr[o].r-tr[o].l+1-tr[o].val;
    }
    return tr[o].val;
}
void ask(int o,int k){
    if(tr[o].l==tr[o].r){
        cout<<"! "<<tr[o].l<<endl;
        change(1,tr[o].l);
        return ;
    }
    int mid=tr[o].l+tr[o].r>>1;
    int res=query(o<<1);
    if(res>=k)    ask(o<<1,k);
    else        ask(o<<1|1,k-res);
}
void solve(){
    cin>>n>>t;
    build(1,1,n);
    while(t--){
        cin>>m;
        ask(1,m);
    }
}

 

posted @ 2021-05-07 21:20  PdrEam  阅读(66)  评论(0编辑  收藏  举报