思路好像和官方题解类似。
贪心,用优先队列维护最小值。
#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;
}