杂题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; }

浙公网安备 33010602011771号