ffe8c57a-0e48-42bc-88e9-094ce62874ec
[传送门](https://www.luogu.com.cn/problem/AT1409)
题意分析
-----------
将第 $i$ 个数提到第一个并输出,也就是倒着扫并输出。倒数第一成为第一,倒数第二成为第二,以此类推,输出该数后标记,最后再枚举一遍,如果没有输出就将它们按正序输出。
思路
------------
定义一个 bool 数组,记录输出与否,如果它为 false 就把它改为 true 且将它输出,下次就不用输出了。然后再从头至尾扫一遍,如果没有输出就将它输出并换行。
```
#include<iostream>
#include<cstdio>
#include<string>
using namespace std;
int n,m,a[100005];//根据题意定义
bool s[100005];//初始值为false
int main()
{
scanf("%d%d",&n,&m);//输入
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);//输入
for(int i=m;i>=1;i--)//倒序枚举
{
if(!s[a[i]])//没有输出
{
s[a[i]]=true;//标记
printf("%d\n",a[i]);//切记要换行!!!
}
}
for(int i=1;i<=n;i++)//寻找没有输出的
{
if(s[i]==true)
continue;//判断
printf("%d\n",i);//换行!!!
}
return 0;
}
```
该题解借鉴了本题题解中许多大佬的思路,
下面列出几位大佬:
@olkieler,@MZY666,@Harry27182,
集合大佬的思路,加入自己的风格和理解,写出了一篇自认为蒟蒻可以看懂的题解。
最后弱弱地说一下:
这是蒟蒻的第一篇题解,不好请私信。
求 daolao 勿喷!!