黑匣子

题目链接:https://www.luogu.com.cn/problem/P1801

题意:

思路:

需要在一个变化(元素不断增加)的数组 快速查找第i小的元素

考虑使用对顶堆

即分别开一个大根堆和一个小根堆
如果要求第几大的元素即让小根堆元素相对大,大根堆元素相对小
如果要求第几小的元素即让大根堆元素相对大,小根堆元素相对小
根据操作不断向后遍历数组并维护对顶堆即可
时间复杂度O(nlogn)

void solve(){
    int m,n;cin>>m>>n;
    vector<int>a(m+1);
    vector<int>u(n+1);
    rep(i,1,m)cin>>a[i];
    rep(i,1,n)cin>>u[i];
    priority_queue<int,vector<int>,greater<int>>qmin;
    priority_queue<int>qmax;
    int now=1;
    int p=1;
    while(p<=n){
        for(int i=now;i<=u[p];i++){
            if(qmax.empty()||qmax.top()>a[i])qmax.push(a[i]);
            else qmin.push(a[i]);
        }
        while(qmax.size()>p){
            qmin.push(qmax.top());
            qmax.pop();
        }
        while(qmax.size()<p&&qmin.size()){
            qmax.push(qmin.top());
            qmin.pop();
        }
        now=u[p]+1;
        p++;
        cout<<qmax.top()<<endl;
    }
}
posted @ 2025-04-27 22:12  Marinaco  阅读(17)  评论(0)    收藏  举报
//雪花飘落效果