BZOJ 1863

lyd口中的夹B递推。

挺妙的解法。

第一个感觉是找到一个最大的相邻的$a_i + a_{i - 1}$就可以了,但是这个想法大概只对了一半,一半的意思是说只有在$n$为偶数的时候才适用,因为只有在偶数的时候,所有数能恰好地被分成两组,两组互不干扰。

奇数的时候就相当于多出了一个$1$,怎么办呢?

显然可以二分答案吧,设$mid$表示当前二分到的颜色的数量。

设$f_i$表示在满足$i - 1$和$i$的限制的条件下,$i$和$1$的颜色冲突的最大个数,再设$g_i$表示这个最小个数,那么有初态$f_1 = g_1 = a_i$。

然后对于$\forall i \in [2, n]$,有

    $f_i = min(a_i, a_1 - g_{i - 1})$

    $g_i = max(0, a_i - (mid - a_{i - 1} - a_1 + f_{i - 1}))$

解释一下这个式子,$i$最大应该是$i - 1$最小,但是这样的选择又要受到$a_i$的条件的限制,所以取个$min$。

想让$i$最小,但是一定要满足$i - 1$的限制,所以可选的颜色数是$mid - a_{i - 1}$再减掉之前$i - 1$和$1$的最大冲突数$a_1 - f_{i - 1}$,然后还要和$0$取个$max$。

时间复杂度$O(nlogMaxn)$。

Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. const int N = ;
  6. const int inf = << ;
  7.  
  8. int n, a[N], f[N], g[N];
  9.  
  10. inline void read(int &X) {
  11. X = ; char ch = ; int op = ;
  12. for(; ch > ''|| ch < ''; ch = getchar())
  13. if(ch == '-') op = -;
  14. for(; ch >= '' && ch <= ''; ch = getchar())
  15. X = (X << ) + (X << ) + ch - ;
  16. X *= op;
  17. }
  18.  
  19. inline int max(int x, int y) {
  20. return x > y ? x : y;
  21. }
  22.  
  23. inline void chkMax(int &x, int y) {
  24. if(y > x) x = y;
  25. }
  26.  
  27. inline int min(int x, int y) {
  28. return x > y ? y : x;
  29. }
  30.  
  31. inline bool chk(int mid) {
  32. f[] = g[]= a[];
  33. for(int i = ; i <= n; i++) {
  34. f[i] = min(a[i], a[] - g[i - ]);
  35. g[i] = max(, a[i] - (mid - a[i - ] - a[] + f[i - ]));
  36. }
  37. return !g[n];
  38. }
  39.  
  40. int main() {
  41. read(n);
  42. int ln = , rn = inf, mid, res = inf;
  43. for(int i = ; i <= n; i++) {
  44. read(a[i]);
  45. if(i > ) chkMax(ln, a[i] + a[i - ]);
  46. }
  47. chkMax(ln, a[] + a[n]);
  48.  
  49. if(n % == ) return printf("%d\n", ln), ;
  50.  
  51. for(; ln <= rn; ) {
  52. mid = (ln + rn) / ;
  53. if(chk(mid)) res = mid, rn = mid - ;
  54. else ln = mid + ;
  55. }
  56.  
  57. printf("%d\n", res);
  58. return ;
  59. }

Luogu 4409 [ZJOI2006]皇帝的烦恼的更多相关文章

  1. [ZJOI2006]皇帝的烦恼

    题解: 具有单调性的题目还是要多想想二分答案 不二分答案暴力dp是n^3的 非常不优秀 二分答案之后就比较好做 mx[i],nx[i]表示最多/最少几个与a[1]相同 代码: #include < ...

  2. 洛谷 P4409 [ZJOI2006] 皇帝的烦恼

    题目链接-> OVO 题解: 很久没有写博客了,可能是因为最近太颓废了吧. 刚刚考完期末考试,无比期盼早点外出学习,不要面对成绩,害怕. #include <cstdio> #inc ...

  3. P4409 [ZJOI2006]皇帝的烦恼(20190922B)(乱搞)

    考场历程十分艰辛啊... 第一题没切掉,还浪费了很长时间,就是一个裸的最小生成树,但是因为可恶的distance为关键字莫名其妙查错了10min.... 本题先乱搞了一下,过了样例 然后看第三题,可写 ...

  4. 【BZOJ】【1863】【ZJOI2006】trouble 皇帝的烦恼

    二分+DP Orz KuribohG 神题啊= = 满足单调性是比较显然的…… 然而蒟蒻并不会判断能否满足……QwQ 神一样的DP姿势:f[i]表示第 i 个与第1个最多有多少个相同,g[i]表示最少 ...

  5. 【DP/二分】BZOJ 1863:[Zjoi2006]trouble 皇帝的烦恼

    863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 465  Solved: 240[Submit][ ...

  6. bzoj1863: [Zjoi2006]trouble 皇帝的烦恼

    白书原题.l边界又设错啦.一般都是错这里吧.注意为什么这里不能是l=0.(只是为了判断第一个和最后一个 #include<cstdio> #include<cstring> # ...

  7. BZOJ 1863: [Zjoi2006]trouble 皇帝的烦恼( 二分答案 )

    二分答案..然后从头到尾推一下, 看最后一个能不能取0个和第一个人相同的勋章 ------------------------------------------------------------- ...

  8. 【BZOJ1863】[Zjoi2006]trouble 皇帝的烦恼 二分+DP

    [BZOJ1863][Zjoi2006]trouble 皇帝的烦恼 Description 经过多年的杀戮,秦皇终于统一了中国.为了抵御外来的侵略,他准备在国土边境安置n名将军.不幸的是这n名将军羽翼 ...

  9. 【BZOJ-1863】trouble 皇帝的烦恼 二分 + DP

    1863: [Zjoi2006]trouble 皇帝的烦恼 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 559  Solved: 295[Submit] ...

随机推荐

  1. canvas基础学习(四)

    今天逛天猫时,看见优衣库店铺首页有个这个飘雪效果,顿时觉得好酷炫,立马从里面copy代码进行学习. 之前我也做过一些canvas特效,往往在canvas全屏时,canvas下层的div就无法进行dom ...

  2. LeetCode Maximum Distance in Arrays

    原题链接在这里:https://leetcode.com/problems/maximum-distance-in-arrays/description/ 题目: Given m arrays, an ...

  3. Qt Creator 中的段落 注释的 快捷方法【转载】

    原文网址:http://jingyan.baidu.com/article/d5c4b52bc2bd1dda560dc5bb.html 作为一名合格的程序员,漂漂亮亮的注释是必须的!!怎么在Qt Cr ...

  4. Mesos-slave启动处理记录

    1. work_dir错误导致启动异常 /etc/mesos-slave/work_dir设置的目录不存在或者权限不够将会导致启动异常. 2. 根据日志信息以及status信息来判断问题 通过serv ...

  5. BZOJ3745:[COCI2015]Norma

    浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...

  6. Linux网络编程——I/O复用之poll函数

    一.回顾前面的select select优点: 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点 select缺点: 1.每次调用 select(),都需要把 fd 集合从用户态拷贝到内核 ...

  7. 蓝桥杯 算法训练 ALGO-129 特殊的数字四十

    算法训练 特殊的数字四十   时间限制:1.0s   内存限制:256.0MB 特殊的数字四十 问题描述 1234是一个非常特殊的四位数,因为它的各位数之和为10,编程求所有这样的四位十进制数. 输出 ...

  8. Spring单例Bean和线程安全

    Spring的bean默认都是单例的,这些单例Bean在多线程程序下如何保证线程安全呢?例如对于Web应用来说,Web容器对于每个用户请求都创建一个单独的Sevlet线程来处理请求,引入Spring框 ...

  9. java中如何将OutputStream转换为InputStream

    在不需要文件生成的情况下,直接将输出流转换成输入流.可使用下面的三种方法: 如果你曾经使用java IO编程,你会很快碰到这种情况,某个类在OutputStream上创建数据而你需要将它发送给某个需要 ...

  10. “百度杯”CTF比赛 九月场

    Test: 题目提示查资料 打开地址,是一个海洋cms 海洋cms有个前台getshell的漏洞 在地址后加上/search.php?searchtype=5&tid=&area=ev ...