2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)

https://www.luogu.com.cn/problem/P2511

题意:

有n根木棍, 第i根木棍的长度为 \(L_i\) ,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007。

分析:

对于第一问,首先二分答案找出ans。

对于第二问,设 sum[i] 表示前 \(i\) 个木棍的长度之和,对于每个木棍 \(i\) ,可以找出在它最前面的木棍 \(j\) ,满足 \(sum_i-sum_j<=ans\) ,把结果存在数组 pos 中。对于前 \(j\) 根木棍分成 \(i\) 组,那么

\[f[i][j]=\sum_{k=pos_j}^{j-1}f[i-1][k]\\
fin=\sum_{i=1}^{m+1}f[i][n]
\]

一看就懂,时间复杂度为傲人的 \(O(n^3)\) ,你可以试试,反正我挂了 。

忽然发现

\[设g[i][j]=\sum_{k=1}^{j}f[i][k]\\
f[i][j]=g[i-1][j]-g[i-1][pos[j]-1]
\]

时间复杂度依旧傲人,不过好了很多,成为 \(O(n^2)\) 。不过你确定不想想空间吗?2个 \(1e7\) 的数组也不小啊。

继续优化:实际上 fg 只和上一轮有关,滚动成一维数组就成~

代码如下:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define IOS ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std; const int N=5e4+10;
const int mod=1e4+7;
int n,m,sum[N],pos[N],a[N],f[N],g[N]; inline int check(int maxn){
int tot=0,len=0;
for(int i=1;i<=n;i++){
if(len+a[i]>maxn)++tot,len=a[i];
else len+=a[i];
if(tot>m)return 0;
}
return tot<=m;
} int main(){
IOS;
cin>>n>>m;
int L=0,R=0,ans;
for(int i=1;i<=n;i++)cin>>a[i],sum[i]=sum[i-1]+a[i],L=max(L,a[i]);
R=sum[n];
while(L<R){
int mid=(L+R)>>1;
if(check(mid))ans=mid,R=mid;
else L=mid+1;
}
cout<<ans<<" ";
int lasti=0;
for(int i=1;i<=n;i++)
for(;lasti<i;lasti++)if(sum[i]-sum[lasti]<=ans){
pos[i]=lasti;
break;
}
int fin=sum[n]<=ans;
for(int i=1;i<=n;i++){
if(sum[i]<=ans)f[i]=1;
g[i]=(g[i-1]+f[i])%mod;
}
for(int i=2;i<=m+1;i++){
for(int j=1;j<=n;j++){
f[j]=g[j-1];
if(pos[j]>=1)f[j]=((f[j]-g[pos[j]-1])%mod+mod)%mod;
}
for(int j=1;j<=n;j++)g[j]=(g[j-1]+f[j])%mod;
fin=(fin+f[n])%mod;
}
cout<<fin;
return 0;
}

2021.12.06 P2511 [HAOI2008]木棍分割(动态规划)的更多相关文章

  1. 2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ π )

    2021.12.06 P2508 [HAOI2008]圆上的整点(数论+ \(\pi\) ) https://www.luogu.com.cn/problem/P2508 题意: 求一个给定的圆 \( ...

  2. 2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP)

    2021.12.06 P1450 [HAOI2008]硬币购物(组合数学+抽屉原理+DP) https://www.luogu.com.cn/problem/P1450 题意: 共有 44 种硬币.面 ...

  3. P2511 [HAOI2008]木棍分割

    目录 Description Solution Code Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, ...

  4. [洛谷P2511][HAOI2008]木棍分割

    题目大意:有$n(n\leqslant5\times10^4)$根木棍,连续放在一起,把它们分成$m(\leqslant10^3)$段,要求使得最长的段最短,问最短的长度以及方案数 题解:要使得最长的 ...

  5. Luogu P2511 [HAOI2008]木棍分割 二分+DP

    思路:二分+DP 提交:3次 错因:二分写萎了,$cnt$记录段数但没有初始化成$1$,$m$切的次数没有$+1$ 思路: 先二分答案,不提: 然后有个很$naive$的$DP$: 设$f[i][j] ...

  6. 题解—P2511 [HAOI2008]木棍分割

    这道题第一眼直接一个二分板子把第一问解决掉,然后主要是统计方案. 其实这个方程还不算难推,只要推出来朴素 \(dp\) ,之后的一步一步也很顺理成章,所以这种题主要看能不能静下心来慢慢做. solut ...

  7. luogu P2511 [HAOI2008]木棍分割

    传送门 第一问是一道经典的二分,二分答案\(ans\),然后从前往后扫,判断要分成几段救星了 第二问设\(f_{i,j}\)表示前\(i\)个数分成\(j\)段,每段之和不超过第一问答案的方案,转移就 ...

  8. 2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS)

    2021.12.06 P2501 [HAOI2006]数字序列(动态规划+LIS) https://www.luogu.com.cn/problem/P2501 题意: 现在我们有一个长度为 n 的整 ...

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

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

随机推荐

  1. django之model,crm操作

    一.字段 AutoField(Field) - int自增列,必须填入参数 primary_key=True BigAutoField(AutoField) - bigint自增列,必须填入参数 pr ...

  2. python的内存回收机制

          变量相当于门牌号,当门牌没有了,即函数的引用都没有调用了,内存的数据就会被清除掉. python内有个定时器,定期的会刷新,如果发现内存中数据被引用了,就会被回收,这个就是内存的回收机制 ...

  3. 网络编程 --安装wkhtmltopdf出现中文乱码的情况

    1 首先下载安装包 2安装依赖文件apt-get install libxfont1 xfonts-encodings xfonts-utils xfonts-base xfonts-75dpi su ...

  4. SpringAOP--aop使用

    SpringAOP使用方式 切点表达式 常用的符号: *:匹配任何数量字符: ..:匹配任何数量字符的重复,如在类型模式中匹配任何数量子包:而在方法参数模式中匹配任何数量参数. +:匹配指定类型的子类 ...

  5. BTree和B+Tree 简单区别

    本篇作用于各种树之间的区别,非算法详细介绍,只是给我们这种非科班出身的一种大概的印象,现在网上更多是讲各种树的怎么实现的细节问题,本篇不涉及那么高深,如果详细了解可以查阅他人的资料,很多大神已经说的很 ...

  6. 是否可以继承String类?

    String 类是final类,不可以被继承. 补充:继承String本身就是一个错误的行为,对String类型最好的重用方式是关联关系(Has-A)和依赖关系(Use-A)而不是继承关系(Is-A) ...

  7. rabbitmq 中 vhost 的作用是什么?

    vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列.绑定.交换器和权限控制: vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据: vhost是AM ...

  8. Java 中你怎样唤醒一个阻塞的线程?

    在 Java 发展史上曾经使用 suspend().resume()方法对于线程进行阻塞唤醒,但 随之出现很多问题,比较典型的还是死锁问题. 解决方案可以使用以对象为目标的阻塞,即利用 Object ...

  9. Linux 网卡配置参数

    网卡配置文件位于 /etc/sysconfig/network-scripts/ 目录下 网卡配置文件在RHEL5/6以eth为网卡文件的前缀,在RHEL7中以ifcfg为网卡文件的前缀 配置 解释 ...

  10. nginx搭建简单直播服务器

    1.下载模块(nginx-rtmp-module) 1 cd /data/nginx 2 yum install git3 git clone https://github.com/arut/ngin ...