题目: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. 在Linux下创建分区和文件系统的方法详解

    在 Linux 中创建分区或新的文件系统通常意味着一件事:安装 Gnome Parted 分区编辑器(GParted).对于大多数 Linux 用户而言,这是唯一的办法.不过,你是否考虑过在终端创建这 ...

  2. 嵌套的SQL另外一种写法

    SELECT a.TradeOrderID 二段交易号 , c.TradeOrderID 一段订单号 , a.BaggingDate AS 出库时间 , a.TransportOrderCode AS ...

  3. mssqlserver,mysql,oracle分页查询

    分页查询语句是sql语句编程中很长见的一个典型应用,用sql语句来分页比一些分页控件的速度要快,所以sql语句的分页在实际编程应用中还是非常广泛的. 今天给大家分享几条不同数据库编程用的分页查询语句. ...

  4. Linux 实用指令之查看端口开启情况

    netstat -ntlp 查看端口使用情况! netstat -ntlp | grep 80 查看具体的端口是否使用! # netstat -ntlp Active Internet connect ...

  5. Python连接MongoDB操作

    1.安装PyMongo 注意:请勿安装“bson”软件包. PyMongo配有自己的bson包; 执行“pip install bson”或“easy_install bson”则会安装与PyMong ...

  6. ThinkPad.E440_FN键反了

    1.一直不知道,为何我的 FN键反了(Fn+F1 才是F1的功能),想改过来.查到是 BIOS中改,但是 BIOS里面没有 那些个修改的选项,于是 还原了BIOS的设置,于是出问题了... 2.问题1 ...

  7. 深入浅出TensorFlow(二):TensorFlow解决MNIST问题入门

    2017年2月16日,Google正式对外发布Google TensorFlow 1.0版本,并保证本次的发布版本API接口完全满足生产环境稳定性要求.这是TensorFlow的一个重要里程碑,标志着 ...

  8. Selenium with Python 006 - 操作浏览器

    #!/usr/bin/env python # -*- coding: utf-8 -*- from selenium import webdriver import time driver = we ...

  9. hdu 5978 To begin or not to begin(概率,找规律)

    To begin or not to begin Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  10. 各种WEB服务器自带的默认Servlet名称

    Tomcat, Jetty, JBoss, and GlassFish 自带的默认Servlet的名字 -- "default" Google App Engine 自带的 默认S ...