求调ABC299G
查看原帖
求调ABC299G
490694
Compound_Interest楼主2023/4/22 22:07

思路好像和官方题解类似。

贪心,用优先队列维护最小值。

题目

#include<cstdio>
#include<stack>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn=2e5+10;
int n,m,a[maxn];
vector<int>ans;
bool vis[maxn],vv[maxn];
stack<int>s;
struct node{
	int val,pos;
	node(int val_,int pos_){
		val=val_,pos=pos_;
	} 
	node(){}
};
bool operator <(node x,node y){
	if(x.val==y.val) return x.pos>y.pos;
	return x.val>y.val;
} 
priority_queue<node>hp;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=n;i>=1;i--)
		if(!vis[a[i]]){
			vis[a[i]]=1;
			s.push(i);
		}
	int pre=0;
	while(!s.empty()){
		int now=s.top();
		s.pop();
		if(vv[a[now]]){
			pre=now;
			continue;
		}
		for(int i=pre+1;i<=now;i++)
			hp.push(node(a[i],i));
		while(!hp.empty()){
			node no=hp.top();
			hp.pop();
			if(no.pos<pre) continue;
			pre=no.pos;
			if(!vv[no.val]){
				vv[no.val]=1;
				ans.push_back(no.val);
			}
		}
		if(!vv[a[now]]) ans.push_back(a[now]);
		vv[a[now]]=1;
		pre=now;
	}
	for(auto i:ans) printf("%d ",i);
	return 0;
}
2023/4/22 22:07
加载中...