题意:

给定一个长度为\(n\)的\(\{-1, 0, 1\}\)组成的序列,你可以进行\(x_i=x_i+x_{i-1}\)这样的操作,求最少操作次数使其变成不降序列。(\(n \le 1000000\))

分析:

我们考虑第\(i\)个数,如果\(x_i < x_{i-1}\),要想\(x_i \ge x_{i-1}\),那么\(x_i\)至少要加一次\(x_{i-1}\)才能大过\(x_{i-1}\)(当然\(x_{i-1} < 0\)那么永远不可能了)。

题解

然后我们猜测,最终的最优序列也一定由\(\\\{-1, 0, 1\\\}\)三个数组成。我们来证明一下:

假设第一个不是\(\\\{-1, 0, 1\\\}\)数的位置为\(p\),且假设\(p < n\),则容易知道\(x_p > 1\)。当\(x_{p+1} = -1\)时,我们要加2次才能大于等于\(x_p\),当\(x_{p+1}=0或1\)时,我们要加1次。而由于\(x_p > 1\),那么说明\(x_p\)也一定能够等于\(1\),这是因为\(x_{p-1}\)必然等于\(1\)(否则\(x_p\)就不会大于\(1\))。而当\(x_p=1\)时,对于\(x_{p+1} \in \\\{-1, 0, 1\\\}\)我们分别只需要加2次、加1次和加0次就能满足\(x_{p+1} \ge x_p\)。显然比\(x_p > 1\)要优。得证。

于是我们设\(d[i, j]\)表示前\(i\)个元素当前元素为\(j\)时的最少操作次数,然后推一下就行了..

#include <bits/stdc++.h>
using namespace std;
const int oo=~0u>>1;
int n, d[2][3]; int main() {
scanf("%d", &n);
int x; scanf("%d", &x);
int *now=d[0], *last=d[1];
last[0]=last[1]=last[2]=oo;
if(x==-1) last[0]=0;
if(x==0) last[1]=0;
if(x==1) last[2]=0;
for(int i=2; i<=n; ++i) {
scanf("%d", &x);
now[0]=now[1]=now[2]=oo;
if(last[0]!=oo) {
now[0]=last[0]+x+1;
if(x>=0) now[1]=last[0]+x;
if(x==1) now[2]=last[0];
}
if(last[1]!=oo) {
if(x==0) now[1]=min(now[1], last[1]);
if(x==1) now[2]=min(now[2], last[1]);
}
if(last[2]!=oo) {
now[2]=min(now[2], last[2]+1-x);
}
swap(now, last);
}
swap(now, last);
int ans=min(min(now[0], now[1]), now[2]);
if(ans==oo) puts("BRAK");
else printf("%d\n", ans);
return 0;
}

【BZOJ】3427: Poi2013 Bytecomputer的更多相关文章

  1. 【BZOJ】3052: [wc2013]糖果公园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3052 题意:n个带颜色的点(m种),q次询问,每次询问x到y的路径上sum{w[次数]*v[颜色]} ...

  2. 【BZOJ】3319: 黑白树

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 题意:给一棵n节点的树(n<=1e6),m个操作(m<=1e6),每次操作有两种: ...

  3. 【BZOJ】3319: 黑白树(并查集+特殊的技巧/-树链剖分+线段树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3319 以为是模板题就复习了下hld............................. 然后n ...

  4. 【BZOJ】1013: [JSOI2008]球形空间产生器sphere

    [BZOJ]1013: [JSOI2008]球形空间产生器sphere 题意:给n+1个n维的点的坐标,要你求出一个到这n+1个点距离相等的点的坐标: 思路:高斯消元即第i个点和第i+1个点处理出一个 ...

  5. 【BZOJ】1002:轮状病毒(基尔霍夫矩阵【附公式推导】或打表)

    Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图 ...

  6. 【BZOJ】【3083】遥远的国度

    树链剖分/dfs序 其实过了[BZOJ][4034][HAOI2015]T2以后就好搞了…… 链修改+子树查询+换根 其实静态树的换根直接树链剖分就可以搞了…… 因为其实只有一样变了:子树 如果roo ...

  7. 【BZOJ】【2434】【NOI2011】阿狸的打字机

    AC自动机+DFS序+BIT 好题啊……orz PoPoQQQ 大爷 一道相似的题目:[BZOJ][3172][TJOI2013]单词 那道题也是在fail树上数有多少个点,只不过这题是在x的fail ...

  8. 【BZOJ】【2738】&【Tsinsen】【A1333】矩阵乘法

    整体二分+树状数组 过了[BZOJ][2527][POI2011]Meteors以后这题就没那么难啦~ 关键是[从小到大]依次插入数字,然后整体二分每个查询的第k大是在第几次插入中被插入的……嗯大概就 ...

  9. 【BZOJ】【3170】【TJOI2103】松鼠聚会

    切比雪夫距离+曼哈顿距离 题解:http://www.cnblogs.com/zyfzyf/p/4105456.html 其实应该先做这题再做[BZOJ][3210]花神的浇花集会的吧…… 我们发现d ...

随机推荐

  1. [Unity] Shader - CG语言 流程控制语句

    CG语言中: 不支持 switch 语句(可以写,但不能很好的执行.) 循环语句中, 循环次数不能大于 1024 ,否则会报错. If...ELSE 条件判断语句: if (true) { } els ...

  2. vtkAnimationCue、vtkCommand和vtkAVIWriter

    1. 用vtkAnimationCue自定义一个vtkCustomAnimationCue类,用来实现球体逐渐张开的过程: 2.用vtkCommand自定义衍生一个vtkCustomAnimation ...

  3. win7提示“User Profile Service服务未能登录”

    注:本文由Colin撰写,版权所有!转载请注明原文地址,谢谢合作! 最近,有个同事打电话告诉我说他的用户名无法登陆到系统,提示“User Profile Service服务未能登录,无法加载用户配置文 ...

  4. JSP分页显示

    首先要定义四个变量: int pageSize: //每页显示多少条记录 int pageNow: //希望显示第几页 int pageCount: //一共有多少页 int rowCount: // ...

  5. PHP定时备份MySQL,mysqldump语法大全

    几个常用操作: 1.备份 # 只导出表结构 d:/PHP/xampp/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p123456 snsgou_sns ...

  6. jquery解析php通过ajax传过来的json二维数组对象

    ajax获得php传过来的json二维数组对象,jquery解析 php代码: <?php $news = array( '武汉'=>array(1,2,3), '广州'=>arra ...

  7. PHP 图片处理工具类(添加水印与生成缩略图)

    =================ImageTool.class.php================= <?php class ImageTool { private $imagePath; ...

  8. 上个项目的一些反思 I

    最近一直在反思之前的项目,发现了很多问题.比如数据安全... 虽然项目需求是只展示最新的数据,所以几乎没用什么本地存储.除了通讯录和用户的Token. 用户通讯录另表,今天反思下用户的Token的存储 ...

  9. phpcms

    phpcms 织梦 帝国cms

  10. stack.sh failing giving error "g-api did not start"

    same issue i faced , tried with ./unstack.sh and ./clean.sh also but couldn't fix the issue.Followin ...