标签:tmp arr Passages int rep pos Rooms ans
题目大意
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;
}
标签:tmp,arr,Passages,int,rep,pos,Rooms,ans 来源: https://blog.csdn.net/luker6/article/details/118577096
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。