http://codeforces.com/gym/102215/problem/A
模拟题
从正向遍历
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define ll long long
const int N= 6e5+100;
int a[N];
int vis[N];
int now[N];
int pos;
inline void Print(int st,int now,int ed)
{
for(int i=st;i<=now;i++)
{
printf("%d ",ed-i);
if(a[i]<0) vis[int(abs(a[i]))]--;
}
}
int main()
{
int n;
scanf("%d",&n);
memset(vis,0,sizeof(vis));
memset(now,0,sizeof(now));
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int st=0;
for(int i=0;i<n;i++)
{
if(a[i]<0)
{
vis[-a[i]]++;
now[-a[i]]=i;//在i这个位置
}
else if(vis[a[i]])
{
//st-now
Print(st,now[a[i]],i);
st=now[a[i]]+1;
}
}
Print(st,n-1,n);
// cout<<st<<end
return 0;
}
也可从反向遍历,好像要简单些(待更)