bzoj 2259 [Oibh]新型计算机 ——最短路(建图)

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2259

不是 n^2 条边!连那条边权为0的边之后,只要每个位置向它的前一个位置和后一个位置连 1 的边,就能等价于一开始就走到那个位置了。

不会有情况使得操作后 a[ i ] 变成负数来走到 j 。因为那样一定不如走到 i 的时候别走到 i 而是直接走到 j 。

注意1号点。如果每个点都向后连 1 的边,最大代价岂不是不大于 n ?所以 1 不能向 2 连边权为1的边,因为1是起点,没有转化的空间。反正也没有点连向1号点。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const int N=1e6+5,M=N*3;
int n,a[N],hd[N],xnt,to[M],nxt[M],w[M];ll dis[N];
bool vis[N];
priority_queue<pair<ll,int> > q;
int rdn()
{
  int ret=0;bool fx=1;char ch=getchar();
  while(ch>‘9‘||ch<‘0‘){if(ch==‘-‘)fx=0;ch=getchar();}
  while(ch>=‘0‘&&ch<=‘9‘) ret=ret*10+ch-‘0‘,ch=getchar();
  return fx?ret:-ret;
}
void add(int x,int y,int z){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;w[xnt]=z;}
void dj()
{
  memset(dis,0x3f,sizeof dis); dis[1]=0;
  q.push(make_pair(0,1));
  while(q.size())
    {
      int k=q.top().second; q.pop();
      if(vis[k])continue; vis[k]=1;
      for(int i=hd[k],v;i;i=nxt[i])
    if(dis[v=to[i]]>dis[k]+w[i])
      {
        dis[v]=dis[k]+w[i];
        q.push(make_pair(-dis[v],v));
      }
    }
}
int main()
{
  n=rdn();for(int i=1;i<=n;i++)a[i]=rdn();
  for(int i=1,d;i<=n;i++)
    {
      if(i>1)add(i,i-1,1),add(i,i+1,1);////if
      d=i+a[i]+1;
      if(d<=n+1)add(i,d,0);
      else add(i,n+1,d-(n+1));
    }
  dj();
  printf("%lld\n",dis[n+1]);
  return 0;
}

原文地址:https://www.cnblogs.com/Narh/p/10054304.html

时间: 2024-10-11 20:07:36

bzoj 2259 [Oibh]新型计算机 ——最短路(建图)的相关文章

【BZOJ2259】[Oibh]新型计算机 最短路

[BZOJ2259][Oibh]新型计算机 Description Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有一些数字(都是自然数——自然数包括0),计算机先读取第一个数字S1,然后顺序向后读入S1个数字.接着再读一个数字S2,顺序向后读入S2个数字……依此类推.不过只有计算机正好将输入序列中的数字读完,它才能正确处理数据,否则计算机就会进行自毁性操

[bzoj2259][Oibh]新型计算机_Dijkstra

新型计算机 bzoj-2259 Oibh 题目大意:给定一个n个数的数列,第i个数为a[i],更改第i个数至x的代价为|x-a[i]|.求最小代价,使得:读入一个数s1后,向后连着读s1个数,然后如s2,再向后读s2个数.保证最后恰好读到第n个数. 注释:$1\le n\le 10^6$ 想法:又开始了... ...在那里一顿dp... 结果又是一个图论题.. ..这场面好熟悉 我们直接从第i个数像第i+a[i]连一条边权为0的边.然后这时我们思考暴力怎么做?暴力的话从i+a[i]开始像左右依次

BZOJ2259 [Oibh]新型计算机

话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zyk的终于知道了怎么回事>_< 1 /************************************************************** 2 Problem: 2259 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:3220 ms 7 Mem

hdu 5294 Tricks Device 最短路建图+最小割

链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 Tricks Device Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 375    Accepted Submission(s): 98 Problem Description Innocent Wu follows Dumb Zh

HDU 5521 [图论][最短路][建图灵感]

/* 思前想后 还是决定坚持写博客吧... 题意: n个点,m个集合.每个集合里边的点是联通的且任意两点之间有一条dis[i]的边(每个集合一个dis[i]) 求同时从第1个点和第n个点出发的两个人相遇的最短时间,并输出相遇的地点,如果有多个按编号大小顺序输出. 输入: 测试数据 t n m 以下m行每行 dis[i] 该集合点的数量 ...每个点的标号 数据范围: n 2-1e5 所有集合的元素的数量和 1e6 思路: 如果直接跑最短路,边会存爆的. 考虑换种思路建边. 每个集合看作两个点,一

【BZOJ1266】【AHOI2006】上学路线route 最短路建图转最小割

题解: 首先那个裸的单源最短路过程就过了吧. 然后说转的最小割. 就是我们考虑到从源点到汇点有多条最短路,我们需要切断一些边,使得所有的最短路都被切断. 首先这是个很裸的模型,切断?最小割! 如果你想不到,那不妨这么想: 我们切断所有最短路,那么每条最短路都有一个路径,上面有若干条边,那么我们需要至少切断其中的一部分. 而所有的局部最短路都满足一个性质: 就是从源点到某点的最短路长度固定(这个很显然吧,都"最"短了) 那么我们让所有的最短路径都被切断,就会使得一些在最短路径之一的边被切

bzoj2662: [BeiJing wc2012]冻结 最短路 建图

好久没有1A题啦?(^?^*) 一个sb建图,我居然调样例调了10min 看起来是双向边,其实在建图的时候要当成有向图, 否则他会时间倒流(233) 把每个点裂成k个点,然后把每条边裂成4条边(正向反向&膜不膜) (话说我好像不会用openlivewriter贴代码,尴尬了) 1 #include <bits/stdc++.h> 2 #define poi(x,y) ((x)*(k+1)+(y)) 3 #define st poi(1,0) 4 #define INF 20000000

2015沈阳区域赛Meeting(最短路 + 建图)

Meeting Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 6865    Accepted Submission(s): 2085 Problem Description Bessie and her friend Elsie decide to have a meeting. However, after Farmer Jo

Codeforces 787D. Legacy 线段树优化建图+最短路

output standard output Rick and his co-workers have made a new radioactive formula and a lot of bad guys are after them. So Rick wants to give his legacy to Morty before bad guys catch them. There are n planets in their universe numbered from 1 to n.