B. Perfect Flush
题目大意
给你N个数,每个数不超过K,并且保障从 1 到 K 的每个数字至少出现一次,让你从这 N 数字中选出来K个数保障每个数都出现一次并且这个子序列的字典序最小;
解题思路
这个可以用单调栈来解决,预先统计每个数字最后一次出现的位置,然后我们想栈中添加元素,如果这个元素添加过了就不用管,如果没用就向里面加,加的时候判断下这个数字是不是当前栈中最上面的元素小如果小并且栈顶元素在后面还有那就把栈顶元素移出去,知道上面条件不满足的时候结束,添加当前元素;
代码
#include<bits/stdc++.h>
using namespace std;
const int M=200200;
int last[M],a[M],ans[M];//last 用来记录最后一次出现的位置
bool f