1. /*
  2. 首先想到二分答案,难点在于如何判断是否有K段,每段和<=mid
  3. 把问题转化成求最多有R段,最少有L段,每段的的和<=mid,如果 L<=K<=R 那么显然存在把这个序列分成K段的策略
  4. 用dp_max[i]表示到i位最多可分成的段数,那么只要枚举下标为[1,i-1]里所有 pre[j]+mid<=pre[i]的 j , 找到最大的dp_max[j]再+1就是dp_max[i]
  5. dp_min[i]同理,然后一旦找到 dp_min[i]<=K<=dp_max[i] 就是可行
  6. 可是n的范围是2e5,我们可以用线段树来优化找dp_max[j]的过程:因为找的是所有pre[j]>=pre[i]-mid的j,那直接用线段树维护代表pre[j]的dp_max[j]即可,然后就可以进行查询
  7. 要注意处理边界问题(pre[0]=0的情况)
  8. */
  9. #include<bits/stdc++.h>
  10. using namespace std;
  11. #define maxn 200005
  12. #define ll long long
  13. #define INF 0x3f3f3f3f3f3f
  14. ll m,k,n,a[maxn],pre[maxn],s[maxn];
  15.  
  16. #define lson l,m,rt<<1
  17. #define rson m+1,r,rt<<1|1
  18. int Max[maxn<<];
  19. void pushup(int rt){Max[rt]=max(Max[rt<<],Max[rt<<|]);}
  20. void update(int pos,int val,int l,int r,int rt){
  21. if(l==r){
  22. Max[rt]=val;return;
  23. }
  24. int m=l+r>>;
  25. if(pos<=m)update(pos,val,lson);
  26. else update(pos,val,rson);
  27. pushup(rt);
  28. }
  29. int query(int L,int R,int l,int r,int rt){
  30. if(L<=l && R>=r){return Max[rt];}
  31. int m=l+r>>,res=-0x3f3f3f3f;
  32. if(L<=m)res=max(res,query(L,R,lson));
  33. if(R>m)res=max(res,query(L,R,rson));
  34. return res;
  35. }
  36. int zero;
  37. int judge(ll mid){
  38. memset(Max,-0x3f,sizeof Max);
  39. update(zero,,,m,);
  40. for(int i=;i<=n;i++){
  41. int pos1=lower_bound(s+,s++m,pre[i]-mid)-s;
  42. int pos2=lower_bound(s+,s++m,pre[i])-s;
  43. if(pos1>m)continue;//越界了,不去线段树里查询
  44. int tmp=query(pos1,m,,m,);//查询区间的最大值
  45. tmp++;
  46. if(tmp>=k)return ;
  47. else update(pos2,tmp,,m,);
  48. }
  49. return ;
  50. }
  51.  
  52. int main(){
  53. int t;cin>>t;
  54. while(t--){
  55. scanf("%lld%lld",&n,&k);
  56. for(int i=;i<=n;i++){
  57. scanf("%lld",&a[i]);
  58. pre[i]=pre[i-]+a[i];
  59. s[++m]=pre[i];
  60. }
  61. s[++m]=;
  62. sort(s+,s++m);
  63. m=unique(s+,s++m)-s-;
  64. zero=lower_bound(s+,s++m,)-s;
  65.  
  66. ll mid,ans,L=-INF,R=INF;
  67. while(L<=R){
  68. mid=L+R>>;
  69. if(judge(mid))
  70. ans=mid,R=mid-;
  71. else L=mid+;
  72. }
  73. cout<<ans<<endl;
  74. }
  75. return ;
  76. }

hdu6606多校第四次04——线段树加速dp的更多相关文章

  1. 2016暑假多校联合---Rikka with Sequence (线段树)

    2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...

  2. 2018.07.08 hdu4521 小明系列问题——小明序列(线段树+简单dp)

    小明系列问题--小明序列 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) Proble ...

  3. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  4. 2018.09.12 poj2376Cleaning Shifts(线段树+简单dp)

    传送门 貌似贪心能过啊%%%. 本蒟蒻写的线段树优化dp. 式子很好推啊. f[i]表示覆盖1~i所需的最小代价. 那么显然对于一个区间[li,ri]" role="present ...

  5. CF833B The Bakery 线段树,DP

    CF833B The Bakery LG传送门 线段树优化DP. 其实这是很久以前就应该做了的一道题,由于颓废一直咕在那里,其实还是挺不错的一道题. 先考虑\(O(n^2k)\)做法:设\(f[i][ ...

  6. Codeforces Round #426 (Div. 2) D 线段树优化dp

    D. The Bakery time limit per test 2.5 seconds memory limit per test 256 megabytes input standard inp ...

  7. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  8. BZOJ2090: [Poi2010]Monotonicity 2【线段树优化DP】

    BZOJ2090: [Poi2010]Monotonicity 2[线段树优化DP] Description 给出N个正整数a[1..N],再给出K个关系符号(>.<或=)s[1..k]. ...

  9. Codeforces 834D The Bakery 【线段树优化DP】*

    Codeforces 834D The Bakery LINK 题目大意是给你一个长度为n的序列分成k段,每一段的贡献是这一段中不同的数的个数,求最大贡献 是第一次做线段树维护DP值的题 感觉还可以, ...

随机推荐

  1. jq enter键发送

    $('.content').keypress(function(e) { if(e.keyCode === 13) { //调用接口 return false; } }) .

  2. zabbix之自动注册,编写触发器:一定时间内超过某个负载值的时间

    zabbix中添加主机很多时可以考虑自动注册来自动添加,下面按照图片顺序来看,zabbix版本:3.0.28 超过负载30%的持续时间 创建触发器:

  3. 【leetcode】951. Flip Equivalent Binary Trees

    题目如下: For a binary tree T, we can define a flip operation as follows: choose any node, and swap the ...

  4. 页面background不随滚动条填充颜色

    这我又遇到了个问题,这问题我连问都不知道该怎么问,先搁在这儿,如果有办法了,再来补充. 原因:因为颜色板块是100%宽度,和页面保持同宽,所以拖动滚动条,右侧就大于了页面宽度. bug:  我写页面的 ...

  5. Windows cmd 打开面板

    { 打开控制面板的命令是:“control”  打开控制面板  命令: rundll32.exe shell32.dll,Control_RunDLL  结果: 显示控制面板窗口.  例子:  Cal ...

  6. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  7. 使用pangolin库画出轨迹

    https://github.com/stevenlovegrove/Pangolin cmake_minimum_required(VERSION 2.8) project(chapter3) ) ...

  8. NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))

    NX二次开发API里没有对EXCAL读写操作的相关函数,市面上有很多种方法去实现,比如UFUN调KF,ODBC,OLE(COM组件)等等.这里我是用的OLE(COM组件)方式去做的,这种在VC上创建的 ...

  9. centos 安装 ImageMagick

    ImageMagick很好用,shell下可以批量对图片做处理,很赞!~ 编译安装 wget http://www.imagemagick.org/download/ImageMagick.tar.g ...

  10. 学 Win32 汇编[20]: 洞察标志寄存器

    15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 NT IOPL OF DF IF TF SF ZF AF PF CF 未使用 嵌套标志 I/O权限标志占2位 溢出标志 方向 ...