题目链接:http://codeforces.com/contest/1272/problem/E

题意:给定n,给定n个数a[i],对每个数输出d[i]。

对于每个i,可以移动到i+a[i]和i-a[i](如果i+a[i]<=n,i-a[i]>=1)

d[i]是指从i移动到任意一个j的步数,需满足条件a[i]和a[j]的奇偶性不同

不论奇偶,相连的边先放进vector邻接表中

如果i和i+a[i]奇偶性不同,那么ans[i]为1,把i放到queue队列里

同理,如果i和i-a[i]奇偶性不同,那么ans[i]为1,把i放到queue队列里

(bfs)

queue队列里存的是每个有答案的点,刚开始队列里所有点的ans都为1。

由于需要a[i]和a[j]奇偶性不同,则只需要跟有答案的点奇偶性相同即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+;
vector<int> v[maxn];
int ans[maxn],a[maxn];
int main()
{
memset(ans,-,sizeof ans);
int n;
scanf("%d",&n);
for(int i=;i<=n;i++)cin>>a[i]; queue<int> q;
for(int i=;i<=n;i++)
{
int j=i+a[i];
if(j<=n)
{
v[j].push_back(i);
if(a[j]%!=a[i]%)
{
ans[i]=;
q.push(i);
}
}
j=i-a[i];
if(j>=)
{
v[j].push_back(i);
if(a[j]%!=a[i]%)
{
ans[i]=;
q.push(i);
}
}
}
while(!q.empty())//bfs
{
int cur=q.front();
q.pop();
for(int n:v[cur])
{
if(ans[n]==-&&a[n]%==a[cur]%)
{
ans[n]=ans[cur]+;
q.push(n);
}
}
}
for(int i=;i<=n;i++)
{
cout<<ans[i]<<" ";
} return ;
}

最新文章

  1. .NET跨平台之旅:将示例站点升级至ASP.NET Core 1.0
  2. sys.stdout.write与sys.sterr.write(一)
  3. ajax提交表单+前端验证小示例
  4. DotNetBar for Windows Forms 11.8.0.8冰河之刃重打包版
  5. 在ArcGIS中如何进行POI点抽稀
  6. Spring EL ternary operator (if-then-else) example
  7. JS三元运算符
  8. 用命令行方式关闭linux防火墙
  9. Java IO学习笔记(三)转换流、数据流、字节数组流
  10. Python基础学习篇章三
  11. &amp;&amp;和&amp;、||和|的区别
  12. echarts4.0折线图让某个点闪烁
  13. JAVA_Class.forName()用法详解
  14. VC++安装及使用
  15. HTML5调用手机的Datepicker(日期选择器)
  16. HTML一些有趣的东西
  17. 杜绝假死,Tomcat容器做到自我保护,设置最大连接数(服务限流:tomcat请求数限制)
  18. 17.scrapy-splash安装-2
  19. Intel Code Challenge Final Round (Div. 1 + Div. 2, Combined) E. Goods transportation 动态规划
  20. 【ARM】定时器

热门文章

  1. JavaScript闭包使用姿势指南
  2. jsoup爬虫实战心得
  3. map的线程安全问题
  4. SpEL + AOP实现注解的动态赋值
  5. nyoj 68-三点顺序(叉积)
  6. 802.11r协议理解
  7. 百度全景地图使用时提示flash版本过低 如何处理?
  8. python2中的SSL:CERTIFICATE_VERIFY_FAILED错误的解决办法
  9. Android、IOS的Fiddler证书安装教程
  10. nginx支持wss配置