二分+bit——cf1354D

用树状数组防止mle

求前k大用二分弄一下前缀和就行

ps:为什么我没打这场cf。。

/*
28*1000*1000b
*/
#include<bits/stdc++.h>
using namespace std;
#define N 1000006

int n;

int c[N];
void add(int x,int v){
    while(x<=n){
        c[x]+=v;
        x+=x&-x;
    }
}
int query(int x){
    int res=0;
    while(x){
        res+=c[x];
        x-=x&-x;
    }
    return res;
}

int  main(){int q;
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        int x;scanf("%d",&x);
        add(x,1);
    } 
    while(q--){int k;
        scanf("%d",&k);
        if(k>0)
            add(k,1);
        else {
            k*=-1;
            int L=1,R=n,mid,ans;//第一个c[i]>=k的地方 
            while(L<=R){
                mid=L+R>>1;
                if(query(mid)>=k)
                    ans=mid,R=mid-1; 
                else L=mid+1;
            }
            add(ans,-1);
        }
    }
    for(int i=1;i<=n;i++)
        if(c[i]){
            cout<<i<<'\n';
            return 0;
    }
    cout<<0<<'\n';
}

 

posted on 2020-05-19 15:50  zsben  阅读(171)  评论(0编辑  收藏  举报

导航