题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044

前缀和优化。

但开成long long会T。(仔细一看不用开long long)

#include<iostream>
#include<cstdio>
#include<cstring>
#define ll long long
using namespace std;
const int N=5e4+,M=;
const ll mod=;
int n,m,a[N],pos[N];
ll dp[N],l,r,lm,s[N],c[N],ans;
void init()
{
while(l<=r)
{
ll mid=((l+r)>>),sum=;int cnt=;
for(int i=;i<=n;i++)
{
if(sum+a[i]>mid)
{
sum=a[i];cnt++;
}
else sum+=a[i];
}
if(cnt->m)l=mid+;//分段,故cnt-1
else lm=mid,r=mid-;
}
printf("%lld ",lm);//
}
void pre()
{
for(int i=;i<=n;i++)
{
if(s[i]>lm)break;dp[i]=;//dp:把前i个分成_段的方案数
}
int now=;
for(int i=;i<=n;i++)
if(s[i]>lm)
{
while(s[i]-s[now]>lm)now++;
pos[i]=now;//pos:本段首个的前一个
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]),l=max(l,(long long)a[i]),s[i]=s[i-]+a[i];r=s[n];
init();pre();
while(m--)//已有分成1段的方案数,再来m次
{
for(int i=;i<=n;i++)c[i]=(c[i-]+dp[i])%mod;//c:dp的前缀和
for(int i=;i<=n;i++)dp[i]=((c[i-]-c[max(,pos[i]-)])%mod+mod)%mod;//pos[i]-1:c[pos[i]]符合
(ans+=dp[n])%=mod;
}
printf("%lld",ans);
return ;
}

TLE的long long

而且如果输出的 lm 改成 lm%mod ,就会WA。只开int就都好啦。(为什么?)

那个处理pos的地方很好。

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=5e4+,mod=;
int n,m,a[N],pos[N],dp[N],l,r,lm,s[N],c[N],ans;
void init()
{
while(l<=r)
{
int mid=((l+r)>>),sum=,cnt=;
for(int i=;i<=n;i++)
{
if(sum+a[i]>mid)
{
sum=a[i];cnt++;
}
else sum+=a[i];
}
if(cnt->m)l=mid+;
else lm=mid,r=mid-;
}
printf("%d ",lm);
}
void pre()
{
for(int i=;i<=n;i++)
{
if(s[i]>lm)break;dp[i]=;//dp:把前i个分成_段的方案数
}
int now=;
for(int i=;i<=n;i++)
if(s[i]>lm)
{
while(s[i]-s[now]>lm)now++;
pos[i]=now;//pos:本段首个的前一个
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]),l=max(l,a[i]),s[i]=s[i-]+a[i];r=s[n];
init();pre();
while(m--)//已有分成1段的方案数,再来m次
{
for(int i=;i<=n;i++)c[i]=(c[i-]+dp[i])%mod;//c:dp的前缀和
for(int i=;i<=n;i++)dp[i]=((c[i-]-c[max(,pos[i]-)])%mod+mod)%mod;//pos[i]-1:c[pos[i]]符合
(ans+=dp[n])%=mod;
}
printf("%d",ans);
return ;
}

bzoj 1044 [HAOI2008]木棍分割——前缀和优化dp的更多相关文章

  1. bzoj1044 [HAOI2008]木棍分割——前缀和优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 咳咳...终于A了... 居然没注意到正着找pos是n方会TLE...所以要倒着找po ...

  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. [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】

    题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...

  5. BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化

    题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...

  6. bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...

  7. BZOJ 1044: [HAOI2008]木棍分割

    Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...

  8. bzoj 1044: [HAOI2008]木棍分割【二分+dp】

    对于第一问二分然后贪心判断即可 对于第二问,设f[i][j]为已经到j为止砍了i段,转移的话从$$ f[i][j]=\sigema f[k][j-1] (s[j]-s[k-1]<=ans) 这里 ...

  9. 1044: [HAOI2008]木棍分割

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

随机推荐

  1. iOS动画进阶 - 手摸手教你写 Slack 的 Loading 动画

    如果移动端访问不佳,可以访问我的个人博客 前几天看了一篇关于动画的博客叫手摸手教你写 Slack 的 Loading 动画,看着挺炫,但是是安卓版的,寻思的着仿造着写一篇iOS版的,下面是我写这个动画 ...

  2. OCR训练数据生成方法

    有的时候我们训练网络的时候,数据集在收集的过程中由于种种原因导致图像收集的不完整,比如某些种类很少,或者没有,这个时候我们就可以考虑自己生成数据集. 这个和data augmentation还不太一样 ...

  3. 初入Spring-boot(一)

    一.利用eclipse快速创建Spring-boot项目 1.首先去http://start.spring.io网站,勾选所需要的starter,如图: 选择完之后下载该文件,打开后发现是一个正常的m ...

  4. 5分钟理解Centos7防火墙firewalld

    版权声明:本内容为原创内容,转载请声明出处. 原文地址:http://www.excelib.com/article/287/show firewalld简介 Centos7中默认将原来的防火墙ipt ...

  5. Java中List集合的常用方法

    List接口是继承Collection接口,所以Collection集合中有的方法,List集合也继承过来. 这篇文章就不讲继承Collection接口的那些方法了 https://www.cnblo ...

  6. ceph存储 ceph Bluestore的架构

    ceph 目前是开源社区比较流行的分布式块存储系统,其以良好的架构,稳定性和完善的数据服务功能,获得的了广泛的部署和应用. 目前ceph 最大的问题是其性能相对较差,特别是无法发挥SSD等高速设备的硬 ...

  7. servlet的补充

    1 request client获得请求. response 设置client响应2 text/html13123 不明确的响应用下载处理.3 MIME类型不明确在w3shool4 两种写utf-8的 ...

  8. Python 乘法口诀表

    环境 Anaconda3 Python 3.6, Window 64bit 目的 输出9*9 乘法口诀表 代码 # -*- coding: utf-8 -*- ''' 1*1=1 2*1=2 2*2= ...

  9. uva 10125 二分

    https://vjudge.net/problem/UVA-10125 和之前做过的一道a+b+c=X的问题类似,不过这个要求多了a+b+c=d-->a+b=d-c  且abcd互不相等 我们 ...

  10. chm下载地址收集

    Js_chm   http://jjidc.jb51.net:81/201007/books/W3C_javascript.rar jQuery_1.7_chm    http://jjidc.jb5 ...