题目: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. 并发-ConcurrentHashMap源码分析

    ConcurrentHashMap 参考: http://www.cnblogs.com/chengxiao/p/6842045.html https://my.oschina.net/hosee/b ...

  2. LeetCode——Keyboard Row

    LeetCode--Keyboard Row Question Given a List of words, return the words that can be typed using lett ...

  3. 基于XML配置的AOP实现日志打印

    Spring中可以使用注解或XML文件配置的方式实现AOP.1.导入jar包 com.springsource.net.sf.cglib -2.2.0.jar com.springsource.org ...

  4. 重装window 7系统,从做一个u盘启动盘,到装系统,很不错

    老毛桃U盘启动盘制作工具是现在最流行的U盘装系统和维护电脑的专用工具,一是制作简单,几乎100%支持所有U盘一键制作为启动盘,不必顾虑以前量产U盘考虑专用工具的问题.二是制作后工具功能强大,支持GHO ...

  5. MapReduce job在JobTracker初始化源码级分析

    mapreduce job提交流程源码级分析(三)中已经说明用户最终调用JobTracker.submitJob方法来向JobTracker提交作业.而这个方法的核心提交方法是JobTracker.a ...

  6. Pandas描述性统计

    有很多方法用来集体计算DataFrame的描述性统计信息和其他相关操作. 其中大多数是sum(),mean()等聚合函数,但其中一些,如sumsum(),产生一个相同大小的对象. 一般来说,这些方法采 ...

  7. Sublime Text C# 编译(csharp.sublime-build)

    制作: 1. 配置环境变量PATH C# 7.0 C:\Program Files (x86)\Microsoft Visual Studio\\Enterprise\MSBuild\15.0\Bin ...

  8. react 总结

    1.React 里直接修改 this.state 和调用 setState() 修改 state 的值有什么区别? 使用对this.state赋值并没有什么作用,官方提醒,应该把this.state当 ...

  9. 命令行创建db2数据库

    在cmd界面执行db2cmd命令 然后在db2cmd界面执行db2命令 然后执行 CREATE DATABASE UIBS命令 创建完成之后可以使用CONNECT TO UIBS命令连接数据库

  10. day5-configparser模块

    一.概述 在软件开发过程中,很多时候需要处理配置文件的读取解析和改写,在python中专门处理配置文件的模块就是configpaser了.顾名思义,configpaser就是配置解析器,可用来对符合格 ...