好题

第一问不难,毕竟二分答案类的题目在USACO上都练了好多遍了

第二问充分的暴露了我dp渣的本性

一开始楞是没想出来

f[i,j]表示到第i根木棒切了j刀满足最长段小于等于ans的方案数

式子是这样的f[i,j]=sigma(f[k,j-1]) if sum[i]-sum[k]<=ans

然后发现我的优化水平还是不错的,

首先是空间上的问题,观察得知,切这刀的方案数只与切前一刀有关,于是我们滚动数组

再看时间,观察k的选取,与这是第几刀无关

再看,如果满足sum[i]-sum[k]<=ans 那么k~i-1一定都是符合的切法

于是我们预先处理一下即可

复杂度为O(nlogn+mn)

 const mo=;
var f:array[..,..] of longint;
    sum,s,a,b:array[..] of longint;
    p,l,r,mid,n,m,i,j,t,ans:longint; function check(s:longint):boolean;
  var t,len,i:longint;
  begin
    t:=;
    len:=;
    p:=;
    for i:= to n do
      if len+a[i]>s then
      begin
        inc(t);
        if t>m then exit(false);
        if len>p then p:=len;
        len:=a[i];
      end
      else len:=len+a[i];
    if len>p then p:=len;
    exit(true);
  end;
begin
  readln(n,m);
  for i:= to n do
  begin
    readln(a[i]);
    sum[i]:=sum[i-]+a[i];
    if l<a[i] then l:=a[i];
  end;
  r:=sum[i];
  while l<=r do     //二分答案
  begin
    mid:=(l+r) shr ;
    if check(mid) then
    begin
      ans:=p;
      r:=p-;
    end
    else l:=mid+;
  end;
  for i:= to n do
    if sum[i]<=ans then f[,i]:= else break;
  j:=;
  for i:= to n do  //预处理
  begin
    while sum[i]-sum[j]>ans do inc(j);
    b[i]:=j;
  end;
  p:=;
  t:=f[p,n];
  for i:= to m do
  begin
    p:=-p;
    fillchar(s,sizeof(s),);
    for j:= to n do
    begin
      if b[j]-> then r:=b[j]- else r:=; //小细节
      f[p,j]:=(s[j-]-s[r]+mo) mod mo;
      s[j]:=(s[j-]+f[-p,j]) mod mo;
    end;
    t:=(t+f[p,n]) mod mo;
  end;
  writeln(ans,' ',t);
end.

bzoj1044的更多相关文章

  1. 【czy系列赛】czy的后宫6 && bzoj1044 [HAOI2008]木棍分割

    题目描述 众所周知的是丧尸czy有很多妹子(虽然很多但是质量不容乐观QAQ),今天czy把n个妹子排成一行来检阅.但是czy的妹子的质量实在--所以czy看不下去了.检阅了第i个妹子会增加czy a[ ...

  2. 【BZOJ1044】[HAOI2008]木棍分割(动态规划,贪心)

    [BZOJ1044][HAOI2008]木棍分割(动态规划,贪心) 题面 BZOJ 洛谷 题解 第一问随便二分一下就好了,贪心\(check\)正确性显然. 第二问随便前缀和+单调队列优化一下\(dp ...

  3. 【BZOJ1044】[HAOI2008]木棍分割

    [BZOJ1044][HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的. 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移 ...

  4. [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  5. BZOJ1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1580  Solved: 567[Submit][Statu ...

  6. bzoj1044[HAOI2008]木棍分割 单调队列优化dp

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4314  Solved: 1664[Submit][Stat ...

  7. 【bzoj1044】木棍分割

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  8. [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  9. bzoj1044: [HAOI2008]木棍分割 二分+dp

    有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少 ...

随机推荐

  1. Python串行运算、并行运算、多线程、多进程对比实验

    转自:http://www.redicecn.com/html/Python/20111223/355.html Python发挥不了多核处理器的性能(据说是受限于GIL,被锁住只能用一个CPU核心, ...

  2. JS中如何判断null

    var exp = null; if (exp == null) { alert("is null"); } exp 为 undefined 时,也会得到与 null 相同的结果, ...

  3. laravel扩展图片处理Intervention Image

    github地址:https://github.com/Intervention/image

  4. 干净的 ef for Oracle appconfg配置

    <?xml version="1.0" encoding="utf-8"?> <configuration> <configSec ...

  5. Linux下mail/mailx命令发送邮件

    最近看到项目中经常会用mail/mailx命令发送由java程序生成的report,比较新鲜.下面就简单介绍下mail/mailx命令用法.本文以mail命令举例(mail/mailx)效果都是一样的 ...

  6. 【BZOJ 1497】 [NOI2006]最大获利

    Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS&T通讯公司在新一代通讯技术血战的前夜,需要做太多的准备工作,仅就站址选择一 ...

  7. linux常用命令及安装软件命令

    1.查看操作系统是33位还是64最简单的方法 getconf LONG_BIT 或者 uname -a 2.常用命令 2.1基本操作 clear 清屏 2.2安装命令 rpm(redhat packa ...

  8. Android中Linux suspend/resume流程

    Android中Linux suspend/resume流程首先我们从linux kernel 的suspend说起,不管你是使用echo mem > /sys/power/state 或者使用 ...

  9. UINavigationController 总结

    一 . UINavigationBar 1.获取 UINavigationBar 对象: [UINavigationBar appearance] ,可以通过该方法对全部 navigation 进行设 ...

  10. 1191: [HNOI2006]超级英雄Hero - BZOJ

    Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金.主持人问题准备了若干道题目,只有当选手正确回 ...