给你n个木棍连起来,可以切成m+1段,你要让最长的一段长度最小,求长度以及方案数量。n<=50000,m<=100

题解:第一个问二分一下就没了....

然后第二个问  用 f[i][j]表示前i个切成j段有多少种  f[i][j]=∑f[i-1][k]  s[k+1]+s[k+2]+...+s[i]<=ans1

很显然转移的部分是连续的一段,并且随着i增大而后移...所以可以用单调队列维护一下

复杂度nlogn+nm

#include<iostream>
#include<cstdio>
#define mod 10007
using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}return x*f;
}int f[2][50005];
int s[50005];
int n,m,ans1;bool check(int x)
{// cout<<"check"<<x<<endl;int num=0,nown=0;for(int i=1;i<=n;i++){if(s[i]>x)return false;nown+=s[i];if(nown>x){nown=s[i];num++;}}if(nown>0)num++;return num<=m;
}int main()
{n=read();m=read()+1;for(int i=1;i<=n;i++)s[i]=read();int l=1,r=1e9,mid;while(l<=r){mid=(l+r)>>1;if(check(mid))ans1=mid,r=mid-1;else l=mid+1;}f[0][0]=f[1][0]=1;for(int i=1;i<=n;i++)s[i]+=s[i-1];int pre=0,nown=1;for(int j=1;j<=m;j++,pre=nown,nown^=1)for(int i=1,tot=0,l=1,r=0;i<=n;i++){tot=(tot+f[pre][r++])%mod;while(l<=r&&s[r]-s[l-1]>ans1)tot=(tot+mod-f[pre][l-1])%mod,++l;f[nown][i]=tot;// cout<<i<<" "<<l<<" "<<r<<" "<<tot<<endl;
    }printf("%d %d\n",ans1,f[pre][n]);return 0;
}

转载于:https://www.cnblogs.com/FallDream/p/bzoj1044.html

[bzoj1044][HAOI2008]木棍分割相关推荐

  1. BZOJ1044: [HAOI2008]木棍分割 (二分 + DP)

    题意:n根木棍依次连在一起 最多切m个端点 使得最长的一段最小 在保证最长的最小的情况下 有多少种不同的切法 题解:第一问傻子都知道二分 第二问想了一会不会做 但其实就是很简单的dp dp[i][j] ...

  2. BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)

    题意 题目链接 Sol 比较套路的一个题. 第一问二分答案check一下 第二问设\(f[i][j]\)表示前\(i\)个数,切了\(j\)段的方案数,单调队列优化一下. 转移的时候只需要保证当前段的 ...

  3. bzoj 1044: [HAOI2008]木棍分割(二分+DP)

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4363  Solved: 1686 [Submit][St ...

  4. 【bzoj1044】[HAOI2008]木棍分割 二分+dp

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

  5. haoi2008木棍分割解题报告

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

  6. 木棍分割[HAOI2008]

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

  7. 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP

    传送门1 传送门2 传送门3 写在前面:就我看来,这是一道不错的题 思路: 一.对于"求总长度最大的一段的长度最小值"这个问题,我们比较容易想到二分答案然后判断是否合法,显然这个是 ...

  8. 2017.3.13 木棍分割 思考记录

    肯定是二分+dp 但只能想出n^2m dp 感觉每个数字的状态都和前面的数字和有关,但划分是灵活的,可以衍生出多种前缀和的情况. 看了题解,但是:   ..  .一脸懵逼,,代码是还pascal的.. ...

  9. 2019.3.summary

    emmmm,把以前写的2b总结丢上来吧,不过应该也不会有人看QAQ (注:因为用txt写的,有一些公式打的很随意,放到markdown上公式自动排版,有可能会显示出错误!可在下方留言) 2019.2. ...

  10. 重走长征路---OI每周刷题记录---9月6日 2014

    总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...

最新文章

  1. Python模块unittest
  2. SQL Server 替换一个字段的特定字符
  3. 如何成为SSP offer收割机|独家经验分享!
  4. Python+Opencv分水岭算法
  5. 宝宝学数学的第一套书,秒杀题海战术!上小学前应该这样学数学!
  6. gets函数会自动加空字符吗_Python高手都知道的内置函数,你不知道就low了
  7. 计算机应用与技术大赛,关于举办2017年燕山大学第一届计算机应用技术与程序设计大赛的通知...
  8. clion上添加程序的预定添加程序的命令行
  9. 201409-1-相邻数对
  10. (原创)无废话C#设计模式之十九:Observer
  11. UVA10424 Love Calculator【水题】
  12. USB3.0 HUB方案之GL3520
  13. mes系统服务器架构,MES系统三大层结构是什么
  14. 华为er路由器设置虚拟服务器,华为AR111-S路由器双线路策略路由配置笔记
  15. multsim 函数发生器的使用
  16. vue项目接口地址暴露_vue组件暴露和.js文件暴露接口的操作方法
  17. DIY电工维修如何拆卸和安装开关面板插座
  18. c语言编程练习题及答案
  19. SAP:调用函数显示MIGO界面
  20. module-info.java什么意思?

热门文章

  1. openfire的搭建与运行(转)
  2. selenium 问题:OSError: [WinError 6] 句柄无效
  3. ACL2021中的25个Transformers模型
  4. 自然语言处理在金融实时事件监测和财务快讯中的应用
  5. 院友故事丨联培博士陈冬冬:顶会百发百中?博导关系?我的PhD经验之谈
  6. NLP硬核入门-PointerNet和CopyNet
  7. python -----class(类)中的object是什么意思?
  8. Spring数据库事务典型错误用法剖析
  9. 每周荐书:分布式、深度学习算法、iOS(评论送书)
  10. 张亚勤新力作《变革中的思索》受热捧