[HAOI2008]木棍分割
题目大意
网址:https://daniu.luogu.org/problemnew/show/P2511
题目大意:
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处.
现在允许你最多砍断m个连接处,砍完后n根木棍被分成了很多段,
要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小.
数据范围: \(n<=50000, 0<=m<=min(n-1,1000)\).
题目解法
第一问弱智题,直接二分即.
第二问考虑DP。 显然f[i][j]表示到了第i根木棍,已经切了j次的方案数。
那么找到i木棍最远可延展距离lev[i]。显然转移为:
\[f[i][j] = ∑f[v][j-1],(Lg[v,i]<=Res)\]
但是这样子显然空间开不下。
观察到j的转移只于j-1有关,可以压掉j。然后考虑如何优化时间复杂度。
显然f[i][j]求和是可以线性记录的。令:
\[g[i][j-1] = g[i-1][j-1] +∑f[v][j-1],(Lg[v,i]<=Res)\]
那么每次转移时,一边转移f,一边修改g,这样就可以实现\(O(1)\)转移了。
最终的空间复杂度为\(O(N)\),时间复杂度为\(O(N*M)\)。
具体代码
#include<bits/stdc++.h>
#define RG register
#define IL inline
#define maxn 100005
#define mod 10007
using namespace std;
int Res,N,M,Ans,Lg[maxn],lev[maxn],f[maxn][3],g[maxn][3];
IL bool Check(RG int x){
RG int d = 0,cnt = 0;
for(RG int i = 1; i <= N; i ++){
if(Lg[i] > x)return false;
if(d + Lg[i] > x){d = Lg[i]; cnt++;}
else d += Lg[i];
}
return cnt <= M;
}
int main()
{
cin>>N>>M;
for(RG int i = 1; i <= N; i ++)cin>>Lg[i];
int L = 0,R = 2000000000; Res = -1;
while(L<=R){
RG int mid = (L+R)>>1;
if(Check(mid)){Res = mid; R = mid - 1;}
else L = mid + 1;
}
for(RG int i = 1; i <= N; i ++)Lg[i] += Lg[i-1];
L = 1;
for(RG int R = 1; R <= N; R ++)
{while(Lg[R] - Lg[L-1] > Res && L<R)L++ ; lev[R] = L;}
for(RG int i = 1; i <= N; i ++)
f[i][0] = (Lg[i] <= Res),g[i][0] = (g[i-1][0] + f[i][0])%mod;
Ans = (Lg[N] <= Res);
for(RG int t = 1; t <= M; t ++){
RG int j = t&1;
g[0][j] = 0;
for(RG int i = 1; i <= N; i ++){
f[i][j] = (g[i-1][j^1] - g[lev[i]-2][j^1] + mod)%mod;
if(i == N)Ans = (Ans + f[i][j])%mod;
g[i][j] = g[i-1][j] + f[i][j];
}
}
cout<<Res<<" "<<Ans; return 0;
}
[HAOI2008]木棍分割的更多相关文章
- BZOJ1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1580 Solved: 567[Submit][Statu ...
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- bzoj1044[HAOI2008]木棍分割 单调队列优化dp
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4314 Solved: 1664[Submit][Stat ...
- 【BZOJ1044】[HAOI2008]木棍分割(动态规划,贪心)
[BZOJ1044][HAOI2008]木棍分割(动态规划,贪心) 题面 BZOJ 洛谷 题解 第一问随便二分一下就好了,贪心\(check\)正确性显然. 第二问随便前缀和+单调队列优化一下\(dp ...
- 【BZOJ1044】[HAOI2008]木棍分割
[BZOJ1044][HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的. 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移 ...
- 1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2161 Solved: 779[Submit][Statu ...
- 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 ...
- BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列
BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...
- HAOI2008 木棍分割 数据结构优化dp+二分答案
很久之前打的题,现在补篇博客 打滚动数组 #E. 木棍分割 Accepted 100 1712 ms 1512 KiB 2019-05-07 17:01:23 Short 不打滚动数组 #419. ...
随机推荐
- Websocket原理及使用场景[转载]
WebSocket的使用场景 社交聊天.弹幕.多玩家游戏.协同编辑.股票基金实时报价.体育实况更新.视频会议/聊天.基于位置的应用.在线教育.智能家居等需要高实时的场景 由轮询到WebSocket 1 ...
- CentOS 7 安装Java 1.8
携程的Apollo配置中心服务端[https://github.com/ctripcorp/apollo/wiki]推荐的Java版本是:1.8+, 本文介绍如何在CentOS上安装java 1.8. ...
- Linux知识体系之磁盘与档案系统管理
硬盘的物理组成:由许许多多的圆形硬盘盘所组成.宜居硬盘盘能够容纳的数据量,而有所谓的单碟或者多碟. 首先,硬盘里一定会有所谓的磁头(Head)在进行该硬盘上面的读写动作,而磁头是固定在机械手臂上的,机 ...
- console那些你不曾知道的玩法
一.console最常见的四种方法: FireFox(58) Chrome(51) 二.打印对象: 平时想输出对象属性时,可以直接打印对象,对Object使用toString方法会得到 [Object ...
- Angular2 ^ 资源链接
Angular2 资源链接 Material Desgin 2 githubhttps://github.com/Promact/md2 DEMOhttp://code.promactinfo.co ...
- SQL查询练习一(From LeetCode)
请选用MySQL进行测试. 1.找出后一天比前一天温度高的日期(E) 思路:将该表进行自关联,然后选择出日期靠后的一天,最后选择温度高的日期 select Weather.Id from Weath ...
- mybatis自动生成mapper,dao映射文件
利用Mybatis-Generator来帮我们自动生成mapper.xml文件,dao文件,model文件. 1.所需文件 关于Mybatis-Generator的下载可以到这个地址:https:// ...
- Tomcat启动出现:Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/SpringMvc]]解决办法
严重: ContainerBase.addChild: start: org.apache.catalina.LifecycleException: Failed to start component ...
- docker 数据卷之进阶篇
笔者在<Docker 基础 : 数据管理>一文中介绍了 docker 数据卷(volume) 的基本用法.随着使用的深入,笔者对 docker 数据卷的理解与认识也在不断的增强.本文将在前 ...
- tcp/ip 卷一 读书笔记(3)为什么既要有IP地址又要有MAC地址
网络层 首先明确一点,并不是所有的网络之间传输数据都需要mac地址和ip地址,比如说点对点线路之间的通信就没有MAC地址,网络层使用ipx协议时就没有ip地址,但是在当前的主流网络中,我们都使用ip地 ...