题意:给你n个数,每个数的值为a[i],每个点可以从i这号点跳转至(i - a[i]) 或 (i + a[i])点,点的范围为[1,n],然后问的是从偶数点跳至奇数点,从奇数点跳至偶数点的最少次数是多少?

解答:这个题很不错,难度系数1900。让我对反向建边有了一定的认识。

为什么需要反向建边呢?因为正向建边无法很好地做到更新当前自身u的情况,但却可以更新v最小的情况(可是所有v中的最小情况明明应该是u的最小情况,这就是正向的缺点)。而可以通过反向建边,不断更新,最后更新到目标点,该目标点已经是最优的情况了。

关于超级源点和超级汇点:我们把所有奇数点与超级源点0相连,偶数点与超级汇点n+1相连,相连距离为0,然后分别跑Dijkstra.

Dijkstra1(以奇数点为起点)跑出来的结果是偶数的最小情况,如果是INF那就说明转换不到输出-1;

Dijkstra2(以偶数点为起点)跑出来的结果是奇数的最小情况,如果是INF那就说明转换不到输出-1;

最后看自己的奇偶性输出自己的情况就行了。

#include<bits/stdc++.h>
#define ll long long
#define white 0
#define black 1
#define grey 2
#define endl '\n'
#define INF 0x3f3f3f3f3f
#define IO ios::sync_with_stdio(false);cin.tie(0);
using namespace std;
const int maxn=3e5+;
int tot,head[maxn];
struct E{
int to,next,w;
}edge[maxn<<];
void add(int u,int v,int w){
edge[tot].to=v;
edge[tot].w=w;
edge[tot].next=head[u];
head[u]=tot++;
}
ll d1[maxn],d2[maxn];ll color[maxn];
priority_queue<pair<ll,ll> >q;
ll n,a[maxn];
void Dijkstra(ll s,ll *d){
for(ll i=;i<=n;i++) d[i]=INF,color[i]=white;
d[s]=;
q.push(make_pair(,s));
color[s]=grey;
while(!q.empty()){
pair<ll,ll> f=q.top();
q.pop();
ll u=f.second;
color[u]=black;
if(d[u]<f.first*(-)) continue;
for(ll i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(color[v]==black) continue;
if(d[v]>d[u]+edge[i].w){
d[v]=d[u]+edge[i].w;
q.push(make_pair(d[v]*(-),v));
color[v]=grey;
}
}
}
}
signed main(){
cin>>n;memset(head,-,sizeof(head));
for(int i=;i<=n;i++){
cin>>a[i];
if(a[i]%==) add(,i,);
if(a[i]%==) add(n+,i,);
if(i+a[i]<=n) add(i+a[i],i,);
if(i-a[i]>=) add(i-a[i],i,);
}
Dijkstra(,d1);
Dijkstra(n+,d2);
for(int i=;i<=n;i++){
if(a[i]%==){
if(d2[i]==INF) cout<<"-1"<<" ";
else cout<<d2[i]<<" ";
}else{
if(d1[i]==INF) cout<<"-1"<<" ";
else cout<<d1[i]<<" ";
}
}
cout<<endl;
}

Codeforces 1272E (Nearest Opposite Parity,反向建边)的更多相关文章

  1. Codeforces Round #605 (Div. 3) E. Nearest Opposite Parity(最短路)

    链接: https://codeforces.com/contest/1272/problem/E 题意: You are given an array a consisting of n integ ...

  2. Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity

    题目链接:http://codeforces.com/contest/1272/problem/E 题意:给定n,给定n个数a[i],对每个数输出d[i]. 对于每个i,可以移动到i+a[i]和i-a ...

  3. Codeforces Round #605 (Div. 3) E - Nearest Opposite Parity (超级源点)

  4. CF1272E. Nearest Opposite Parity 题解 广度优先搜索

    题目链接:http://codeforces.com/contest/1272/problem/E 题目大意: 有一个长度为n的数组 \(a\) ,数组坐标从 \(1\) 到 \(n\) . 假设你现 ...

  5. CodeForces - 350B(反向建图,)

    B - Resort CodeForces - 350B B. Resort time limit per test 2 seconds memory limit per test 256 megab ...

  6. poj1122 FDNY to the Rescue!(dij+反向建图+输出路径)

    题目链接:poj1122 FDNY to the Rescue! 题意:给出矩阵,矩阵中每个元素tij表示从第i个交叉路口到第j个交叉路口所需时间,若tij为-1则表示两交叉路口之间没有直接路径,再给 ...

  7. HDU4857——逃生(反向建图+拓扑排序)(BestCoder Round #1)

    逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会 ...

  8. POJ3687——Labeling Balls(反向建图+拓扑排序)

    Labeling Balls DescriptionWindy has N balls of distinct weights from 1 unit to N units. Now he tries ...

  9. Codeforces #180 div2 C Parity Game

    // Codeforces #180 div2 C Parity Game // // 这个问题的意思被摄物体没有解释 // // 这个主题是如此的狠一点(对我来说,),不多说了这 // // 解决问 ...

随机推荐

  1. iview使用之怎样通过render函数在table组件表头添加图标及判断多个状态

    在实际项目开发中,我们经常会用到各种各样的表格,比如在表格中填加下拉菜单,按钮,图标及可以根据状态显示对应文字等等,因为这段时间一直在做后台管理系统,所以表格用的就比较多,当然UI组件库我用的是ivi ...

  2. MySql的数据库方言问题

    在使用hibernate将po(一般对象类)转化为数据库表时,如果mysql的版本为5.0之前的,则方言写为:<property name="dialect">org. ...

  3. Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed

    Centos8安装Docker提示:package docker-ce-3:19.03.8-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but ...

  4. anaconda 使用conda命令创建虚拟环境

    1.首先在所在系统中安装Anaconda.可以打开命令行输入conda -V检验是否安装以及当前conda的版本. 2.conda常用的命令. 1)conda list 查看安装了哪些包. 2)con ...

  5. ES6让字符串String增加了哪些好玩的特性呢?

    确实因为现在天气变热了,所以一天天的这么写我也很累.所以如果阅读的时候有什么错误还请大家指出来,不好意思.学习永无止境. OK,今天继续讲解ES6系列知识 学过上一节的解构赋值就知道,ES6确实给我们 ...

  6. 8个超好用的Python内置函数,提升效率必备(小白必看)

    python中有许多内置函数,不像print那么广为人知,但它们却异常的强大,用好了可以大大提高代码效率. 这次来梳理下8个好用的python内置函数. 1.set() 当需要对一个列表进行去重操作的 ...

  7. Linux 日常操作

    Linux 日常操作 */--> Linux 日常操作 Table of Contents 1. 查看硬件信息 1.1. 服务器型号序列号 1.2. 主板型号 1.3. 查看BIOS信息 1.4 ...

  8. ajax 报0错误

    本以为在本地测试不会跨越,结果检查下来就是跨域的问题!!!! 来源:https://www.cnblogs.com/xiezn/p/5651093.html PHP Ajax 跨域问题最佳解决方案   ...

  9. 解决Cannot use a scalar value as an array

    这是类型转换的问题,看看上方代码是不是先把布尔值或者0值赋给了一个变量,然后下面循环中又把这个变量当作数组用了

  10. VirtualBox 原始镜像转换成 vdi 镜像

    VBoxManage convertdd [-static] <filename> <outputfile> 将raw硬盘转换成vdi虚拟硬盘