ABC299G 题解
Kevin090228 · · 个人记录
题意
给定一个长为
思路
字典序最小显然想到贪心,我们注意到在原来
选择答案序列的第二个数的过程与上面的类似。我们考虑用双指针维护此时当前能选的
时间复杂度
代码
int a[200200];
int cnt[200200],cc;
bool flag[200200];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",a+i);
for(int i=1;i<=n;i++)
{
cnt[a[i]]++;
if(cnt[a[i]]==1) cc++;
}
set<pii> st;
int p=1;
st.insert(mp(a[1],1));
int lst=0;
for(int i=m;i>=1;i--)
{
while(p<=n&&(flag[a[p]]||cnt[a[p]]>1))
{
cnt[a[p]]--;
p++;
st.insert(mp(a[p],p));
}
while(sz(st)&&(flag[st.begin()->first]||st.begin()->second<=lst))
st.erase(st.begin());
printf("%d ",st.begin()->first);
lst=st.begin()->second;
flag[st.begin()->first]=1;
}
return 0;
}