[bzoj1044][HAOI2008]木棍分割
给你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]木棍分割相关推荐
- BZOJ1044: [HAOI2008]木棍分割 (二分 + DP)
题意:n根木棍依次连在一起 最多切m个端点 使得最长的一段最小 在保证最长的最小的情况下 有多少种不同的切法 题解:第一问傻子都知道二分 第二问想了一会不会做 但其实就是很简单的dp dp[i][j] ...
- BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)
题意 题目链接 Sol 比较套路的一个题. 第一问二分答案check一下 第二问设\(f[i][j]\)表示前\(i\)个数,切了\(j\)段的方案数,单调队列优化一下. 转移的时候只需要保证当前段的 ...
- bzoj 1044: [HAOI2008]木棍分割(二分+DP)
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4363 Solved: 1686 [Submit][St ...
- 【bzoj1044】[HAOI2008]木棍分割 二分+dp
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且 ...
- haoi2008木棍分割解题报告
[问题描述] 有n根木棍,第i根木棍的长度为Li,n根木棍依次连结在一起,总共有n-1个连接处.现在允许你最多砍断m个连接处,砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小,并且输出有 ...
- 木棍分割[HAOI2008]
题目描述 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连 接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并 ...
- 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP
传送门1 传送门2 传送门3 写在前面:就我看来,这是一道不错的题 思路: 一.对于"求总长度最大的一段的长度最小值"这个问题,我们比较容易想到二分答案然后判断是否合法,显然这个是 ...
- 2017.3.13 木棍分割 思考记录
肯定是二分+dp 但只能想出n^2m dp 感觉每个数字的状态都和前面的数字和有关,但划分是灵活的,可以衍生出多种前缀和的情况. 看了题解,但是: .. .一脸懵逼,,代码是还pascal的.. ...
- 2019.3.summary
emmmm,把以前写的2b总结丢上来吧,不过应该也不会有人看QAQ (注:因为用txt写的,有一些公式打的很随意,放到markdown上公式自动排版,有可能会显示出错误!可在下方留言) 2019.2. ...
- 重走长征路---OI每周刷题记录---9月6日 2014
总目录详见https://blog.csdn.net/mrcrack/article/details/84471041 做题原则,找不到测评地址的题不做.2018-11-28 重走长征路---OI每周 ...
最新文章
- Python模块unittest
- SQL Server 替换一个字段的特定字符
- 如何成为SSP offer收割机|独家经验分享!
- Python+Opencv分水岭算法
- 宝宝学数学的第一套书,秒杀题海战术!上小学前应该这样学数学!
- gets函数会自动加空字符吗_Python高手都知道的内置函数,你不知道就low了
- 计算机应用与技术大赛,关于举办2017年燕山大学第一届计算机应用技术与程序设计大赛的通知...
- clion上添加程序的预定添加程序的命令行
- 201409-1-相邻数对
- (原创)无废话C#设计模式之十九:Observer
- UVA10424 Love Calculator【水题】
- USB3.0 HUB方案之GL3520
- mes系统服务器架构,MES系统三大层结构是什么
- 华为er路由器设置虚拟服务器,华为AR111-S路由器双线路策略路由配置笔记
- multsim 函数发生器的使用
- vue项目接口地址暴露_vue组件暴露和.js文件暴露接口的操作方法
- DIY电工维修如何拆卸和安装开关面板插座
- c语言编程练习题及答案
- SAP:调用函数显示MIGO界面
- module-info.java什么意思?
热门文章
- openfire的搭建与运行(转)
- selenium 问题:OSError: [WinError 6] 句柄无效
- ACL2021中的25个Transformers模型
- 自然语言处理在金融实时事件监测和财务快讯中的应用
- 院友故事丨联培博士陈冬冬:顶会百发百中?博导关系?我的PhD经验之谈
- NLP硬核入门-PointerNet和CopyNet
- python -----class(类)中的object是什么意思?
- Spring数据库事务典型错误用法剖析
- 每周荐书:分布式、深度学习算法、iOS(评论送书)
- 张亚勤新力作《变革中的思索》受热捧