Description

Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题。

但是,有一个难题他却解决不了,是这台计算机的输入问题。新型计算机的输入也很独特,假设输入序列中有一些数字(都是自然数——自然数包括0),计算机先读取第一个数字S1,然后顺序向后读入S1个数字。接着再读一个数字S2,顺序向后读入S2个数字……依此类推。不过只有计算机正好将输入序列中的数字读完,它才能正确处理数据,否则计算机就会进行自毁性操作!

Tim现在有一串输入序列。但可能不是合法的,也就是可能会对计算机造成破坏。于是他想对序列中的每一个数字做一些更改,加上一个数或者减去一个数,当然,仍然保持其为自然数。使得更改后的序列为一个新型计算机可以接受的合法序列。

不过Tim还希望更改的总代价最小,所谓总代价,就是对序列中每一个数操作的参数的绝对值之和。

写一个程序:

 从文件中读入原始的输入序列;

 计算将输入序列改变为合法序列需要的最小代价;

 向输出文件打印结果。

Input

输入文件包含两行,第一行一个正整数N,N<1 000 001。

输入文件第二行包含N个自然数,表示输入序列。

Output

仅一个整数,表示把输入序列改变为合法序列需要的最小代价,保证最小代价小于109。

Sample Input

4

2 2 2 2

Sample Output

1


思路

傻子最短路

直接发现加一减一和移动绝对值的位置是等价的

就在有可能贡献的区间内把相邻节点连上边就可以了

然后傻逼最短路


  1. //Author: dream_maker
  2. #include<bits/stdc++.h>
  3. using namespace std;
  4. //----------------------------------------------
  5. //typename
  6. typedef long long ll;
  7. //convenient for
  8. #define fu(a, b, c) for (int a = b; a <= c; ++a)
  9. #define fd(a, b, c) for (int a = b; a >= c; --a)
  10. #define fv(a, b) for (int a = 0; a < (signed)b.size(); ++a)
  11. //inf of different typename
  12. const int INF_of_int = 1e9;
  13. const ll INF_of_ll = 1e18;
  14. //fast read and write
  15. template <typename T>
  16. void Read(T &x) {
  17. bool w = 1;x = 0;
  18. char c = getchar();
  19. while (!isdigit(c) && c != '-') c = getchar();
  20. if (c == '-') w = 0, c = getchar();
  21. while (isdigit(c)) {
  22. x = (x<<1) + (x<<3) + c -'0';
  23. c = getchar();
  24. }
  25. if (!w) x = -x;
  26. }
  27. template <typename T>
  28. void Write(T x) {
  29. if (x < 0) {
  30. putchar('-');
  31. x = -x;
  32. }
  33. if (x > 9) Write(x / 10);
  34. putchar(x % 10 + '0');
  35. }
  36. //----------------------------------------------
  37. const int N = 1e6 + 10;
  38. struct Edge{
  39. int v, w, nxt;
  40. Edge(int v = 0, int w = 0, int nxt = 0):v(v), w(w), nxt(nxt) {};
  41. }E[N * 6];
  42. int head[N], tot = 0;
  43. int inq[N], dis[N];
  44. int pre[N], nxt[N], a[N], n;
  45. void add(int u, int v, int w) {
  46. E[++tot] = Edge(v, w, head[u]);
  47. head[u] = tot;
  48. }
  49. void spfa() {
  50. memset(dis, 0x3f, sizeof(dis));
  51. queue<int> q;
  52. q.push(1);
  53. dis[1] = 0;
  54. while (!q.empty()) {
  55. int u = q.front(); q.pop();
  56. inq[u] = 0;
  57. for(int i = head[u]; i; i = E[i].nxt) {
  58. int v = E[i].v;
  59. if (dis[v] > dis[u] + E[i].w) {
  60. dis[v] = dis[u] + E[i].w;
  61. if (!inq[v]) inq[v] = 1, q.push(v);
  62. }
  63. }
  64. }
  65. }
  66. int main() {
  67. Read(n);
  68. fu(i, 1, n) {
  69. Read(a[i]);
  70. fu(j, i + 1, min(i + a[i] + 1,n)) {
  71. if (pre[j]) break;
  72. pre[j] = 1;
  73. add(j, j - 1, 1);
  74. }
  75. fu(j, i + a[i] + 1, n) {
  76. if (nxt[j]) break;
  77. nxt[j] = 1;
  78. add(j, j + 1, 1);
  79. }
  80. if (i + a[i] <= n) add(i, i + a[i] + 1, 0);
  81. else add(i, n + 1, a[i] + i - n);
  82. }
  83. spfa();
  84. Write(dis[n + 1]);
  85. return 0;
  86. }

BZOJ2259 [Oibh]新型计算机 【傻逼最短路】的更多相关文章

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

    新型计算机 bzoj-2259 Oibh 题目大意:给定一个n个数的数列,第i个数为a[i],更改第i个数至x的代价为|x-a[i]|.求最小代价,使得:读入一个数s1后,向后连着读s1个数,然后如s ...

  2. BZOJ2259 [Oibh]新型计算机

    话说hzwer你在坑爹?... 我按照你的建图交了上去,发现WA. 开始检查= =...过了好久,突然觉得画风不对...hzwer您建图错了啊!!! 后来看了看zky的终于知道了怎么回事>_&l ...

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

    [BZOJ2259][Oibh]新型计算机 Description Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计 ...

  4. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra

    题目描述 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有 ...

  5. BZOJ_2259_ [Oibh]新型计算机 _最短路

    Description Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假 ...

  6. bzoj 2259 [Oibh] 新型计算机 —— 最短路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2259 相邻点之间连边权为1的边,就是水最短路了: 要注意点上的数不能改成负数,但是想一想改成 ...

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

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2259 不是 n^2 条边!连那条边权为0的边之后,只要每个位置向它的前一个位置和后一个位置连 ...

  8. bzoj 2259: [Oibh]新型计算机 最短路 建模

    Code: #include<cstdio> #include<cstring> #include<algorithm> #include<queue> ...

  9. 我一个自己的关于II和&&的逻辑判断(傻逼型)

    原因 首先概述下起始原因:本来埋点的数据中传递来的URL只有http://开头的数据,所以上一个编写此程序的人在定义产品ID和出发口岸时加了这样的判断 然后...悲剧(傻逼)开始了 因为业务需求,埋点 ...

随机推荐

  1. BZOJ4767 两双手

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  2. git拉取GitLab工程报错Repository not found

    # git clone http://xxx/jiqing/frog.git 正克隆到 'frog'... fatal: repository 'http://xxx/jiqing/frog.git/ ...

  3. phalcon: 项目地址/P(.*), 项目地址/Pbaidu 与 路由

    phalcon: 项目地址/P(.*) 与 路由 有一个项目地址:因客户渠道不同,带的参数也不相同.当时想到的是伪静态规则,但是发现自己没有那么强大.该走phalcon路由规则,地址如下: www.x ...

  4. vim 删除多列

    比如想删除一个文件的1-1000行的前3列: gg #到文件首ctrl+v #可视块模式999j,2l #注意是小写的J和L(方向键向下和向右也可以)d #删除

  5. Ansible 小手册系列 十六(Playbook Debug)

    debug模块在执行期间打印语句,并且可用于调试变量或表达式,而不必停止playbook. 打印自定义的信息 - debug: msg="System {{ inventory_hostna ...

  6. 不使用构造方法创建Java对象: objenesis的基本使用方法

    转载:http://blog.csdn.net/codershamo/article/details/52015206 objenesis简介: objenesis是一个小型Java类库用来实例化一个 ...

  7. golang版并发爬虫

    准备爬取内涵段子的几则笑话,先查看网址:http://www.budejie.com/text/ 简单分析后发现每页的url呈加1趋势 第一页: http://www.budejie.com/text ...

  8. 【zznu-夏季队内积分赛3-F】学无止境

    题目描述 “别人总说我瓜,其实我一点也不瓜,大多数时候我都机智的一批“ACM程序设计竞赛是一个团体项目.宝儿姐作为其中优秀的一份子,每天好好学习天天向上.曾经宝儿姐给自己定了一个计划,刷穿bzoj.于 ...

  9. SpringXML方式配置bean的生存范围Scope

    在一个bean的配置里面可以指定一个属性Scope,也就是bean的范围,bean的生命周期. Scope可取的值5种:singleton(默认).prototype.request.session. ...

  10. Nginx配置请求转发location及rewrite规则

    一个示例: location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这 ...