杂题003 对顶堆

P1801 黑匣子

  简单的说,这道题的意思就是插入的同时查询第k小的值。可以这样思考,创建一个大根堆和一个小根堆,大根堆里装前k-1个小的数,出现插入操作的时候就将新元素和大根堆堆顶比较,比堆顶元素大就将堆顶元素推入小根堆,不然推该元素。出现查询,直接输出小根堆堆顶元素。

 

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
priority_queue<int,vector<int>,greater<int>> q;
priority_queue<int> p;
int m,n,a[N],k[N];
int main()
{
    cin>>m>>n;
    for(int i=1;i<=m;i++)
        cin>>a[i];
    for(int i=1;i<=n;i++)
        cin>>k[i];
    k[0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=k[i-1]+1;j<=k[i];j++)
        {
            if(p.empty()||a[j]>=p.top())
            {
                q.push(a[j]);
            }
            else
            {
                q.push(p.top());
                p.pop();
                p.push(a[j]);
            }
        }
        cout<<q.top()<<endl;
        p.push(q.top());
        q.pop();
    }
    return 0;
}

 

posted @ 2026-08-14 11:10  Noname_min  阅读(3)  评论(0)    收藏  举报