P1801 黑匣子

链接: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;
}

posted @ 2024-09-09 16:37  WHUStar  阅读(9)  评论(0编辑  收藏  举报