BZOJ P1044[HAOI2008]木棍分割
来源:互联网 发布:支付宝超强助手源码 编辑:程序博客网 时间:2024/05/15 20:47
第一问二分答案+判断
第二问DP发现空间时间双超
然后下面是优化
空间:直接滚存即可
时间:发现转移的一段是连续的区间,直接单调队列优化 降到O(MN)因为每一个元素只可能入队和出队一次
#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>using namespace std;const int zyy=10007;int f[2][50003];int s[50003];int n,m,ans1;bool check(int x){ 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(){ cin>>n>>m; m++; for(int i=1;i<=n;i++){ cin>>s[i];} 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]=1;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++])%zyy; while(l<=r&&s[r]-s[l-1]>ans1){ tot=(tot-f[pre][l-1]+zyy)%zyy;++l;} f[nown][i]=tot; }}cout<<ans1<<" "<<f[pre][n]<<endl; return 0;}/*in:3 21110out:10 2*/
1 0
- BZOJ P1044[HAOI2008]木棍分割
- BZOJ 1044: [HAOI2008]木棍分割
- bzoj.1044: [HAOI2008]木棍分割
- 【BZOJ 1044】[HAOI2008]木棍分割
- bzoj 1044 [HAOI2008]木棍分割 题解
- BZOJ 1044: [HAOI2008]木棍分割 二分 dp
- BZOJ 1044 洛谷 2511 [HAOI2008] 木棍分割
- [HAOI2008]木棍分割
- bzoj1044[HAOI2008]木棍分割
- 【bzoj1044】【HAOI2008】【木棍分割】
- [BZOJ1044] [HAOI2008]木棍分割
- BZOJ1044/HAOI2008木棍分割
- BZOJ1044 [HAOI2008]木棍分割
- bzoj1044: [HAOI2008]木棍分割
- BZOJ1044: [HAOI2008]木棍分割
- 1044: [HAOI2008]木棍分割
- 【BZOJ1044】【HAOI2008】木棍分割
- P4244【HAOI2008】木棍分割
- TestNG 图解说明
- JS实现求数组重复第N多元素——数组实现
- 机器学习算法类别
- Mac下QT编译输出路径错误:ld unknown option ...
- java基础 int变量自增 效率问题
- BZOJ P1044[HAOI2008]木棍分割
- mybatis_01
- 蓝桥杯_最大比例
- Linux实现简单的进度条
- python-str,list,set间的转换
- 网络编程简介
- 求深度的笔记
- SPOJ
- Docker 入门(1)