传送门
单调栈
#include<cmath>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<math.h>
#define LL long long
using namespace std;
#include<queue>
#include<vector>
//如果因为字典序最小,所以考虑对于新来的一个数x,可不可以将栈顶元素y给替换掉,
//替换掉的条件就是:x ≤ y并且后面还存在一个y,这样就可以保证替换掉以后y还可以补上。
const int N=1e6+10;
int a[N],book[N],vis[N],stack[N];
int main()
{
int n,k,top=0;
scanf("%d %d",&n,&k);
memset(book,0,sizeof(book));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
book[a[i]]=i ; //标记出现的位置
}
for(int i=1;i<=n;i++)
{
if(vis[a[i]])
continue; //标记是否出现过
while(stack[top]>=a[i]&&book[stack[top]]>i) //与栈顶元素进行比较 如果当前元素比栈顶小 ,并且当前栈顶元素在后来出现过
{
vis[stack[top--]]=0; //删除这个栈顶
}
stack[++top]=a[i]; //标记新栈顶
vis[a[i]]=1; //标记已经出现过
}
for(int i=1;i<=k;i++)
printf("%d ",stack[i]);
return 0;
}