题目大意
n+1个地牢,编号从0到n,其中有n个通道,编号从1到n;
每个通道一个锁,每种锁有正负两种,正的可以多次通过,负的通过一次后,这种锁失效。
问在房间s内,拥有所有种类的所,最多能到达几个房间。
0
<
=
s
<
=
n
−
1
0 <= s <= n-1
0<=s<=n−1
题解
从后往前遍历,如果是正数,后面的数值+1,记录对应通行证的最新位置
如果是负数,判断后面是否出现,如果没有出现,+1;如果出现了,计算位置差。
#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define fep(i,a,b) for(int i=b;i>=a;--i)
const int inf = 1e9+7;
const int N = 5e5+5;
int arr[N], pos[N], ans[N];
void solve()
{
int n;
scanf("%d",&n);
rep(i,0,n-1)
scanf("%d",&arr[i]);
int tmp = inf;
fep(i,0,n-1)
{
if(arr[i]>0)
{
ans[i] = ans[i+1]+1;
pos[arr[i]] = i; // 记录最新出现的位置
}
else // 为负数的情况
{
if(!pos[-arr[i]]) ans[i] = ans[i+1] + 1; // 如果后面没有
else{
tmp = min(tmp,pos[-arr[i]]);
ans[i] = tmp - i;
}
}
}
rep(i,0,n-1) printf("%d%c",ans[i],i==n-1?'\n':' ');
}
int main() {
solve();
return 0;
}