Luogu P2511 [HAOI2008]木棍分割 二分+DP
思路:二分+DP
提交:3次
错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$
思路:
先二分答案,不提;
然后有个很$naive$的$DP$:
设$f[i][j]$表示分成$i$段,到第$j$个木棍的方案数,$l$表示二分后的答案,
所以有$f[i][j]=\sum_{j到k+1根木棍的总长度\leq l}$ $f[i-1][k]$
$ans=\sum_{i=1}^{m+1}f[i][n]$
但他太慢了$QwQ$
于是我们优化一下:
把$f[i-1][1]$到$f[i-1][k]$前缀和一下记做$s[i-1][k]$,这样可以$O(1)$查区间;
然后对于每个木棍$j$,预处理"$j$到$k+1$根木棍的总长度$\leq l$"中的$k$,记为$pos[j]$
所以现在有$f[i][j]=s[i-1][j]-s[i-1][pos[j]-1]$
然后惊喜地发现第一维可以滚掉?!
代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define ull unsigned long long
#define ll long long
#define R register ll
#define pause (for(R i=1;i<=10000000000;++i))
#define In freopen("NOIPAK++.in","r",stdin)
#define Out freopen("out.out","w",stdout)
namespace Fread {
static char B[<<],*S=B,*D=B;
#ifndef JACK
#define getchar() (S==D&&(D=(S=B)+fread(B,1,1<<15,stdin),S==D)?EOF:*S++)
#endif
inline int g() {
R ret=,fix=; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-:fix;
if(ch==EOF) return EOF; do ret=ret*+(ch^); while(isdigit(ch=getchar())); return ret*fix;
} inline bool isempty(const char& ch) {return (ch<=||ch>=);}
inline void gs(char* s) {
register char ch; while(isempty(ch=getchar()));
do *s++=ch; while(!isempty(ch=getchar()));
}
} using Fread::g; using Fread::gs; namespace Luitaryi {
const int N=,M=;
int n,m,pos[N];
ll ans,mx,a[N],sum[N],f[N],s[N];
inline bool ck(int x) { R cnt=,sum=;
for(R i=;i<=n;++i) {
if(sum+a[i]>x) sum=,++cnt;
sum+=a[i];
if(cnt>m+) return false;
} return cnt<=m+;
}
inline void main() {
n=g(),m=g();
for(R i=;i<=n;++i) a[i]=g(),mx=max(a[i],mx),sum[i]=sum[i-]+a[i];
R l=mx,r=sum[n]+;
while(l<r) {
R md=l+r>>; if(ck(md)) r=md;
else l=md+;
} printf("%d ",l); R p=;
for(R i=;i<=n;++i) {
while(sum[i]-sum[p]>l&&p<i) ++p;
pos[i]=p;
}
for(R i=;i<=n;++i) f[i]=sum[i]<=l,s[i]=(s[i-]+f[i]); ans=sum[n]<=l;
for(R i=;i<=m+;++i) {
for(R j=;j<=n;++j) {
f[j]=s[j-];
if(pos[j]->) f[j]=((f[j]-s[pos[j]-])%M+M)%M;
}
for(R j=;j<=n;++j) s[j]=(s[j-]+f[j])%M;
ans=(ans+f[n])%M;
} printf("%lld\n",ans);
}
}
signed main() {
Luitaryi::main();
return ;
}
2019.07.19
Luogu P2511 [HAOI2008]木棍分割 二分+DP的更多相关文章
- 【bzoj1044】[HAOI2008]木棍分割 二分+dp
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...
- luogu P2511 [HAOI2008]木棍分割
传送门 第一问是一道经典的二分,二分答案\(ans\),然后从前往后扫,判断要分成几段救星了 第二问设\(f_{i,j}\)表示前\(i\)个数分成\(j\)段,每段之和不超过第一问答案的方案,转移就 ...
- bzoj1044: [HAOI2008]木棍分割 二分+dp
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少 ...
- 2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)
2021.12.06 P2511 [HAOI2008]木棍分割(动态规划) https://www.luogu.com.cn/problem/P2511 题意: 有n根木棍, 第i根木棍的长度为 \( ...
- 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 MB Submit: 4112 Solved: 1577 [Submit][St ...
- 【BZOJ】1044: [HAOI2008]木棍分割 二分+区间DP
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1044 Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, ...
- [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
随机推荐
- springboot集成mongoDB简易使用
1.首先是添加Spring Data mongo的配置依赖 <dependency> <groupId>org.springframework.boot</groupId ...
- java http接口请求响应 request response
接口类: 1 package org.sunshine.dcda.epg.wechat.controller.niao; 2 3 import javax.servlet.http.HttpServl ...
- CentOS7下使用Harbor搭建Docker私有仓库
相关资料: Harbor官方网站:https://goharbor.io/ Harbor Github地址:https://github.com/goharbor/harbor ⒈安装Docker(必 ...
- 剑指offer35:数组中的逆序对
1 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P%10 ...
- MySQL8.0哪些新特性你最期待
1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3.并行redo log,并提升redo l ...
- 关于FSM的C语言实现与详解
最近一个项目有一个需求,考量了一下决定使用状态机,实现完需求以后,不得不感慨,状态机在处理逻辑上面实现起来很有优势,也便于管理. 在这里分享一下我所修改的状态机实现.改动的地方不多,参考了<C语 ...
- Antd组件库,利用Menu组件模拟一个简单Tree组件
当前工作中,前端的主要技术栈用是vue. 那React怎么办呢?总不至于把他扔在墙角吧! 只能在一些很小的项目上,也只有自己一个前端的时候,悄悄的上React. 当然,React项目UI组件还是最喜欢 ...
- 怎样测试nginx.conf配置文件的正确性
方法: 使用 nginx -t 命令 nginx -t 如果一切正常, 则会显示:
- Scala学习二十——Actor
一.本章要点 每个actor都要扩展Actor类并提供act方法 要往actor发送消息,可以用actor!message 消息发送是异步的:”发完就忘“ 要接受消息,actor可以调用receive ...
- C++通用框架和库
C++通用框架和库 来源 https://www.cnblogs.com/skyus/articles/8524408.html 关于 C++ 框架.库和资源的一些汇总列表,内容包括:标准库.Web应 ...