Early Orders

Early Orders

题意:

n个数 范围 1-k, 保证都存在, 找到 大小为k的 k个数都存在的字典序 最小的序列

题解:

我们 需要 尽可能地让答案正确

则:

我们给定一个 栈 ans[] 保存可能出现在答案中的 数值 把不可能存在的全都删掉

一个数的值为v, 位置为 vis

则一定满足:

ans[]中存在v, 忽略当前操作

ans[] 中不存在v, 则把 之前的所有大于 该值的 且在 vis后 出现过的 数 删掉 。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,k;
const int N = 2e5+5;
int arr[N];
stack<int>p1;
int last[N];

void output(stack<int> P){
	stack<int>y;
	while(!P.empty()){
		y.push(P.top());
		P.pop();
	}
	while(!y.empty()){
		cout<<y.top()<<" ";y.pop();
	}cout<<endl;
}
signed main(){
	cin >> n >> k;
	for(int i=1;i<=n;i++){
		cin >> arr[i];
		last[arr[i]] = i;
	}
	set<int>st;
	for(int i=1;i<=n;i++){
		if(p1.empty()){
			p1.push(arr[i]);st.insert(arr[i]);continue;
		}
		while(1){
			int tp = p1.top();
			if(tp > arr[i] && last[tp] > i && st.count(arr[i])==0){
				st.erase(tp);p1.pop();
			}
			else{
				break;
			}
			if(p1.empty())break;
		}
		if(!st.count(arr[i])){
			p1.push(arr[i]);
		}
		st.insert(arr[i]);
	}
	output(p1);
}
posted @ 2021-03-08 14:19  Fi  阅读(86)  评论(0编辑  收藏  举报