链接:https://www.luogu.com.cn/problem/P1801
题目:
思路:
非常有意思的双根对顶堆。具体来说就是一个大根堆+一个小根堆,然后不断淘汰,用大根堆当基底,每次输出小根堆的top并放到大根堆中。
代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
const int N=2e5+10;
int a[N],u[N];
int m,n;
priority_queue<int,vector<int>,less<int>>s;
priority_queue<int,vector<int>,greater<int>>b;
signed main()
{
IOS;
cin>>m>>n;
for(int i=1;i<=m;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>u[i];
for(int i=1;i<=n;i++)
{
for(int j=u[i-1]+1;j<=u[i];j++)
{
s.push(a[j]);
b.push(s.top());
s.pop();
}
cout<<b.top()<<'\n';
s.push(b.top());
b.pop();
}
return 0;
}
标签:大根堆,黑匣子,int,IOS,long,priority,P1801
From: https://www.cnblogs.com/zzzsacmblog/p/18404820