A. Rooms and Passages

题目大意

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;
}

上一篇:Codeforces Round #732 (Div. 2)


下一篇:Solution -「多校联训」数学考试