Early Ordered 思维题
题意
有n个数,从中不改变顺序找出从1到m的每一个数并保证字典序最小
题解
构造一个数组存储临时答案,从前向后遍历每一个数,如果不在临时答案数组里,则加入数组,加入前将他前面的比他小的、之后还会出现的数全部删掉保证字典序最小
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define ull unsigned long long
#define ld long double
inline int read()
{
char ch = getchar();int x = 0, f = 1;
while(ch<'0'||ch>'9'){if(ch == '-') f = -1;ch = getchar();}
while('0'<=ch && ch <= '9'){x = x*10+ch-'0';ch = getchar();}
return x*f;
}
ll mod=1e9+7;
ll INF=1e15;
ll Inf=0x3f3f3f3f;
const int N=2e5+5;
int a[N],b[N],p[N],f[N],q=0;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
int n,m;
n=read();
m=read();
for(int i=1;i<=n;++i)
{
a[i]=read();
b[a[i]]++;
}
for(int i=1;i<=n;++i)
{
b[a[i]]--;
if(!f[a[i]])
{
while(a[i]<p[q] && b[p[q]])
{
f[p[q--]]=0;
}
f[a[i]]=1;
p[++q]=a[i];
}
}
for(int i=1;i<=m;++i)
cout<<p[i]<<" ";
return 0;
}