BZOJ 1044 木棍分割
二分+dp.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 50050
#define mod 10007
using namespace std;
int n,m,l[maxn],len,sums=,lb[maxn],dp[maxn][],sum[maxn][],mx=,ans=;
bool check(int len)
{
int now=l[],ret=;
for (int i=;i<=n;i++)
{
if (now+l[i]>len) {ret++;now=l[i];}
else now+=l[i];
}
return ret<=m;
}
void binary_search()
{
int l=mx,r=sums;
while (l<=r)
{
int mid=(l+r)>>;
if (check(mid)) {len=mid;r=mid-;}
else l=mid+;
}
}
void get_bnd()
{
int ret=,now=;
for (int i=;i<=n;i++)
{
ret-=l[i-];
while ((ret+l[now+]<=len) && (now+<=n))
{
now++;ret+=l[now];
lb[now]=i;
}
}
}
void dps()
{
for (int i=;i<=n;i++) if (lb[i]==) dp[i][]=;
for (int i=;i<=n;i++) sum[i][]=sum[i-][]+dp[i][];
ans+=dp[n][];
for (int i=;i<=m;i++)
{
for (int j=;j<=n;j++)
{
if (j<=i) {dp[j][i&]=sum[j][i&]=;continue;}
if (lb[j]-) dp[j][i&]=(sum[j-][(i&)^]-sum[lb[j]-][(i&)^]+mod)%mod;
else dp[j][i&]=sum[j-][(i&)^]%mod;
sum[j][i&]=(sum[j-][i&]+dp[j][i&])%mod;
}
ans=(ans+dp[n][i&])%mod;
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++) {scanf("%d",&l[i]);sums+=l[i];mx=max(mx,l[i]);}
binary_search();
get_bnd();
dps();
printf("%d %d\n",len,ans);
return ;
}
BZOJ 1044 木棍分割的更多相关文章
- BZOJ 1044 木棍分割 解题报告(二分+DP)
来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...
- BZOJ 1044 木棍分割(二分答案 + DP优化)
题目链接 木棍分割 1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3830 Solved: 1453[S ...
- 【BZOJ】【1044】【HAOI2008】木棍分割
二分/DP 真是一道好题! 第一问很简单的二分…… 第二问一开始我想成贪心了,其实应该是DP的= = 然后没有注意……又MLE又TLE的……这题要对DP进行时空两方面的优化!! 题解:(by JoeF ...
- [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】
题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- 1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2161 Solved: 779[Submit][Statu ...
- BZOJ 1044
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1393 Solved: 497[Submit][Statu ...
- BZOJ1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1580 Solved: 567[Submit][Statu ...
- bzoj1044[HAOI2008]木棍分割 单调队列优化dp
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4314 Solved: 1664[Submit][Stat ...
随机推荐
- Redhat 安装Oracle DBI和DBD
Redhat 安装DBI和ORACLE DBD tar -zxvf DBI-1.616.tar.gz cd DBI-1.616 perl Makefile.PL make make install 2 ...
- 17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制使用新的master和slaves:
17.1.1.7 Setting Up Replication with New Master and Slaves 设置复制使用新的master和slaves: 最简单和最直接方式是设置复制使用新的 ...
- WCF Host中的BaseAddress 和 Endpoint中的Address的区别
http://stackoverflow.com/questions/18720810/wcf-service-base-address-vs-endpoint-address baseAddress ...
- Android 全屏显示-隐藏Navigation Bar
Sumsung Galaxy Nexus 屏幕分辨率为 1280X 720,但通常的应用都会显示Navigation Bar(Back 键,Home 键等),如下图所示: 但我注意到Youtube应用 ...
- HDOJ --- 2151 Worm
Worm Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- (转)Ubuntu下彻底卸载mysql
感谢原作者,文章内容很实用.原文链接:http://www.blogjava.net/yjhmily/articles/336926.html ============================ ...
- vijosP1037搭建双塔
vijosP1037搭建双塔 链接:https://vijos.org/p/1037 [思路] DP. [代码] #include<iostream> #include<cstrin ...
- 从Spark-Shell到SparkContext的函数调用路径过程分析(源码)
不急,循序渐进,先打好基础 Spark shell的原理 首先,我们清晰定位找到这几个. 1.spark-shell 2. spark-submit 3.spark-class 4.SparkSu ...
- poj 3468 A Simple Problem with Integers【线段树区间修改】
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 79137 ...
- JSP实现数据库(MySQL)查询——Java Web练习(二)
1.创建数据库表student(数据库test01) 2.修改success.jsp页面,修改后的页面整体代码如下: <%@ page language="java" imp ...