BZOJ1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1580 Solved: 567
[Submit][Status]
Description
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007。。。
Input
输入文件第一行有2个数n,m. 接下来n行每行一个正整数Li,表示第i根木棍的长度.
Output
输出有2个数, 第一个数是总长度最大的一段的长度最小值, 第二个数是有多少种砍的方法使得满足条件.
Sample Input
1
1
10
Sample Output
两种砍的方法: (1)(1)(10)和(1 1)(10)
数据范围
n<=50000, 0<=m<=min(n-1,1000).
1<=Li<=1000.
HINT
Source
题解:
第一问二分+贪心可以得出
第二份朴素的话最坏情况下是O(mn^2)的,但考虑到每一个接点有pre[i],表示满足s[i]-s[j]<=ans的最大j,这样转移的时候
有f[i,j]=sigma(f[k,j-1])(pre[i]<=k<=i-1),考虑到pre[i]是单增的的,所以我们可以用单调队列来搞,优化到O(mn),不过也可以不用队列,
只用一个临时变量来记录当前时刻有用的节点的权值和
下面说一些题外话:
1.感觉此题很难写
2.写程序的时候,一要易懂,不容易出错,而才是简短,优美,不要一上来就想着可以怎么怎么减少代码,否则会把自己搞晕
代码:
const maxn=+;p=;
var i,j,n,m,x,ans,cnt,l,r,mid,t,sum:longint;
q,pre,len,s:array[..maxn] of longint;
f:array[..maxn,..] of longint;
procedure init;
begin
readln(n,m);
for i:= to n do begin readln(len[i]);s[i]:=s[i-]+len[i];end;
s[n+]:=maxlongint;
end;
function test(x:longint):boolean;
var i,j,sum:longint;
begin
sum:=;j:=;
for i:= to n do
if sum+len[i]<=x then inc(sum,len[i])
else begin inc(j);sum:=len[i];end;
exit(j<=m);
end;
procedure main;
begin
l:=;r:=;
while l<r do
begin
mid:=(l+r)>>;
if test(mid) then r:=mid else l:=mid+;
end;
ans:=l;
j:=;
for i:= to n do
begin
while s[i]-s[j]>ans do inc(j);
pre[i]:=j;
end;
fillchar(f,sizeof(f),);
i:=;while s[i]<=ans do begin f[i,]:=;inc(i);end;
t:=;cnt:=;
for i:= to m do
begin
t:=-t;
l:=;r:=;sum:=;
for j:= to n do
begin
while (l<r) and (q[l]<pre[j]) do begin sum:=(sum-f[q[l],-t]+p) mod p;inc(l);end;
f[j,t]:=sum;
inc(r);q[r]:=j;sum:=(sum+f[q[r],-t]) mod p;
end;
cnt:=(cnt+f[n,t]) mod p;
end;
writeln(ans,' ',cnt);
end;
begin
assign(input,'input.txt');assign(output,'output.txt');
reset(input);rewrite(output);
init;
main;
close(input);close(output);
end.
BZOJ1044: [HAOI2008]木棍分割的更多相关文章
- bzoj1044[HAOI2008]木棍分割 单调队列优化dp
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4314 Solved: 1664[Submit][Stat ...
- BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4281 Solved: 1644 [Submit][St ...
- [BZOJ1044][HAOI2008]木棍分割 二分+贪心+dp+前缀和优化
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4112 Solved: 1577 [Submit][St ...
- 【czy系列赛】czy的后宫6 && bzoj1044 [HAOI2008]木棍分割
题目描述 众所周知的是丧尸czy有很多妹子(虽然很多但是质量不容乐观QAQ),今天czy把n个妹子排成一行来检阅.但是czy的妹子的质量实在--所以czy看不下去了.检阅了第i个妹子会增加czy a[ ...
- [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- bzoj1044: [HAOI2008]木棍分割 二分+dp
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少 ...
- 【动态规划】bzoj1044: [HAOI2008]木棍分割
需要滚动优化或者short int卡空间 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍 ...
- BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)
题意 题目链接 Sol 比较套路的一个题. 第一问二分答案check一下 第二问设\(f[i][j]\)表示前\(i\)个数,切了\(j\)段的方案数,单调队列优化一下. 转移的时候只需要保证当前段的 ...
随机推荐
- 第八篇:python高级之多进程
python高级之多进程 python高级之多进程 本节内容 多进程概念 Process类 进程间通讯 进程同步 进程池 1.多进程概念 multiprocessing is a package ...
- css(字体,文本,边距,边框,阴影,背景,渐变,多重背景,列表)
font-family 设置字体名称 可以使用多个名称,用逗号分隔,浏览器则按照先后顺序依次使用可用字体 p { font-family:'宋体','黑体','Arial'; } font-size ...
- C## 输出Hello world
首先新建一个项目 然后在文件D:\C##Obj\HelloWorld\HelloWorld\Program.cs using System; using System.Collections.Gene ...
- PHP面向对象的基本写法(区别于java)
<?php /** * 这是一个人的对象 */ class ClassName { public $name; public $age; public $sex; public static $ ...
- IsPostBack and DropdownList.
Encounted the issue accident when helping my classmate dealing with his homework assignment,it turns ...
- xcode7 icon图标设置
- Bootstrap_表单_表单提示信息
平常在制作表单验证时,要提供不同的提示信息.在Bootstrap框架中也提供了这样的效果.使用了一个"help-block"样式,将提示信息以块状显示,并且显示在控件底部. < ...
- Html5游戏框架createJs的简单用法
声明:本文为原创文章,如需转载,请注明来源WAxes,谢谢!http://www.it165.net/pro/html/201403/11105.html 楼主记忆力不好,最近刚好用了一下create ...
- 接受POST表单传过来的信息 可以用foreach循环进行遍历操作
if(isset($_POST['Goods'])){ foreach($_POST['Goods'] as $_k =>$_v){ ...
- openerp 中如何方便对搜索时间段
以前为了方便的搜索时间区间,经常用wizard对方式,设置开始 结束时间,需要做大量对代码工作, 今天看了search view对组成, 可以用2个filter_domain 来做, 这样用户需要输 ...