Sorting the Coins
题目链接:CodeForces - 875B题意:共有n个硬币, 每次在pi位置放一枚硬币 ,问每次放完硬币后至少需要扫描几次才能确保每个硬币的右侧位置有硬币(发现i位置右边为空则把i位置的硬币右移一个位置, 然后继续扫描, 直到扫描到第n个位置此时完成一次扫描);
每放一个硬币查询从最右边空位置开始有几个硬币, 扫描k+1次(k为硬币个数), k次后一定已经使每个硬币右侧不为空,但还需再扫描一次检验, 所以是k+1;
此题就相当于将最右侧硬币移到n位置, 一直到移完第一个硬币;
但是直接便利会T, 所以需要想办法, 直接扫一遍就可出答案;
我们可以发现若最右侧为空, 那么现有的所有硬币都要右移, 若最右侧不为空, 倒数第二个位置为空,那么就少移动一个硬币, 所以只需知道右侧填满了几个硬币, 就少移动了几次;
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; bool vis[300010]; int p[300010]; int main(){ int n; scanf("%d", &n); memset(vis, false, sizeof(vis)); vis[n+1]=true; for(int i=1; i<=n; i++){ scanf("%d", &p[i]); } printf("%d", 1); int ans=1, final=n; for(int i=1; i<=n; i++){ vis[p[i]]=true, ans++; while(vis[final]) ans--, final--; printf(" %d", ans); } return 0; }