http://codeforces.com/problemset/problem/876/D
该题主要思路就是从尾到头遍历,如果碰到棋子就让数量++,并让遍历的上届减少到下一位,如果不是棋子则break,因此这样循环的总时间复杂度就只有On,不会tle。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[333333];
bool b[333333];
int n;
while(scanf("%d",&n)!=EOF)
{
memset(b,0,sizeof(b));
int ans=0;
int ss;
int dir=n;
a[0]=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&ss);
b[ss]=1;
for(int j=dir;j>0;j--)
{
if(b[j])
{
dir--;
ans++;
}
else break;
}
a[i]=i-ans;
}
cout<<a[0]+1;
for(int i=1;i<=n;i++)
{
cout<<" "<<a[i]+1;
}
cout<<endl;
}
return 0;
}