没写过几道的前缀和优化\(dp\)

第一问是小学生难度的二分

第二问就直接\(dp\)了

设\(dp[i][j]\)表示当前分割点在\(i\)之后,前面一共分割了\(j\)段的方案数

利用前缀和单调性,通过二分预处理出每一个点往前能扩展到的最大位置,之后前缀和优化就可以啦

但是发现这个样子空间会炸,而这个样子还没有办法滚动起来

那好办交换一下状态的顺序就可以啦,就可以前缀和/滚动数组优化了

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#define re register
#define maxn 50005
#define max(a,b) ((a)>(b)?(a):(b))
const int mod=10007;
int a[maxn],n,m;
int dp[2][maxn],pre[2][maxn];
int p[maxn],to[maxn];
int ans;
inline int read()
{
char c=getchar();
int x=0;
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x;
}
inline int check(int x)
{
int now=0,tot=0;
for(re int i=1;i<=n;i++)
{
if(now+a[i]>x) now=a[i],tot++;
else now+=a[i];
if(tot>m) return 0;
}
return tot<=m;
}
inline int find(int l,int r,int now)
{
int t;
while(l<=r)
{
int mid=l+r>>1;
if(p[now]-p[mid]>ans) l=mid+1;
else r=mid-1,t=mid;
}
return t;
}
int l,r;
int main()
{
n=read(),m=read();
for(re int i=1;i<=n;i++) a[i]=read(),r+=a[i],l=max(l,a[i]);
for(re int i=1;i<=n;i++) p[i]=p[i-1]+a[i];
while(l<=r)
{
int mid=l+r>>1;
if(check(mid)) ans=mid,r=mid-1;
else l=mid+1;
}
printf("%d ",ans);
for(re int i=1;i<=n;i++)
to[i]=find(0,i-1,i)+1;
for(re int i=1;i<=n;i++) if(p[i]<=ans) dp[0][i]=1;
for(re int i=1;i<=n;i++) pre[0][i]=pre[0][i-1]+dp[0][i];
int o=0,cnt=0;
cnt=(cnt+dp[0][n])%mod;
for(re int i=2;i<=m+1;i++,o^=1)
{
memset(dp[o^1],0,sizeof(dp[o^1]));
for(re int j=1;j<=n;j++)
dp[o^1][j]=(dp[o^1][j]+pre[o][j-1]-(j-2<0?0:pre[o][to[j]-2])+mod)%mod;
pre[o^1][0]=0;
for(re int j=1;j<=n;j++)
pre[o^1][j]=(pre[o^1][j-1]+dp[o^1][j])%mod;
cnt=(cnt+dp[o^1][n])%mod;
}
printf("%d\n",cnt);
return 0;
}

【[HAOI2008]木棍分割】的更多相关文章

  1. BZOJ1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1580  Solved: 567[Submit][Statu ...

  2. BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)

    第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...

  3. bzoj1044[HAOI2008]木棍分割 单调队列优化dp

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4314  Solved: 1664[Submit][Stat ...

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

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

  5. 【BZOJ1044】[HAOI2008]木棍分割

    [BZOJ1044][HAOI2008]木棍分割 题面 bzoj 洛谷 题解 第一问显然可以二分出来的. 第二问: 设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数 发现每次转移 ...

  6. 1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2161  Solved: 779[Submit][Statu ...

  7. BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】

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

  8. [BZOJ1044][HAOI2008]木棍分割 二分+贪心+dp+前缀和优化

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

  9. BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP+单调队列

    BZOJ_1044_[HAOI2008]木棍分割_二分答案+DP Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个 ...

  10. HAOI2008 木棍分割 数据结构优化dp+二分答案

    很久之前打的题,现在补篇博客 打滚动数组 #E. 木棍分割 Accepted 100 1712 ms 1512 KiB   2019-05-07 17:01:23 Short 不打滚动数组 #419. ...

随机推荐

  1. rancher初级(搭建+基本操作+web应用部署)

    Rancher搭建 首先rancher需要安装了docker的linux环境,我的系统版本为 在docker的基础上启动rancher服务器,Rancher 服务器是一个 Docker image,所 ...

  2. linux输出之 printf 讲解--->与 echo 的区别

    printf 你接触过printf没呢?? 如果你学了c语言的话你肯定就熟悉了,如果没有的话,不要急,,我保证你马上就会了! 我们来看一下案例: 这个可以看出来吧,echo输出的话会对文本换行哦,但是 ...

  3. python 爬虫系列04-电影天堂连接爬虫

    学习的第四个爬虫 from lxml import etree import requests BASE_D = 'http://www.dytt8.net' headers = { 'User-Ag ...

  4. DP Intro - Tree DP Examples

    因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...

  5. mongodb连接失败原因排查

    安装了mongodb,添加了管理员root和test数据库的用户rex,并且开启的用户认证. 按照说明文档连接mongodb数据库:$mongo = new Mongo("mongodb:/ ...

  6. 聚焦游戏安全,腾讯云GAME-TECH“空降”上海

    游戏行业是DDoS攻击高发行业,占DDoS攻击的六成以上,特别是近年来游戏行业的爆发式增长,游戏行业更成为了黑产.外挂.非法信息的聚集地.安全,已然成为游戏行业当前最大的敌人. 6月29日,腾讯云GA ...

  7. 命令行编译java项目

    命令行编译java项目 项目名: testproj 目录 src -> cn -> busix -> test bin lib 编译项目 cd testproj javac -d . ...

  8. rpm重装python和yum

    前些天升级的python, yum就不能用了, 提示 "No module named yum", 然后搜索了一下, 说要重装python和yum, 也没多想, 就按照那些教程去做 ...

  9. git/github 代码托管图文教程

    现在都流行将代码托管到github,使用版本控制工具git,现在让我们开始一步一步的将我们本地的代码托管到github上去吧 一. git的使用 1.下载git工具 2.下载好后安装时候注意要使用vi ...

  10. NPOI之C#下载Excel

    Java中这个类库叫POI,C#中叫NPOI,很多从Java一直到.Net平台的类库为了区别大部分都是在前面加个N,比如Hibernate和NHibernate. npoi下载地址 一.使用NPOI下 ...