bzoj 1044 [HAOI2008]木棍分割——前缀和优化dp
题目: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的更多相关文章
- bzoj1044 [HAOI2008]木棍分割——前缀和优化DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 咳咳...终于A了... 居然没注意到正着找pos是n方会TLE...所以要倒着找po ...
- BZOJ 1044: [HAOI2008]木棍分割(二分答案 + dp)
第一问可以二分答案,然后贪心来判断. 第二问dp, dp[i][j] = sigma(dp[k][j - 1]) (1 <= k <i, sum[i] - sum[k] <= ans ...
- bzoj1044[HAOI2008]木棍分割 单调队列优化dp
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4314 Solved: 1664[Submit][Stat ...
- [BZOJ 1044] [HAOI2008] 木棍分割 【二分 + DP】
题目链接:BZOJ 1044 第一问是一个十分显然的二分,贪心Check(),很容易就能求出最小的最大长度 Len . 第二问求方案总数,使用 DP 求解. 使用前缀和,令 Sum[i] 为前 i 根 ...
- BZOJ 1044: [HAOI2008]木棍分割 DP 前缀和优化
题目链接 咳咳咳,第一次没大看题解做DP 以前的我应该是这样的 哇咔咔,这tm咋做,不管了,先看个题解,再写代码 终于看懂了,卧槽咋写啊,算了还是抄吧 第一问类似于noip的那个跳房子,随便做 这里重 ...
- bzoj 1044 [HAOI2008]木棍分割(二分+贪心,DP+优化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1044 [题意] n根木棍拼到一起,最多可以切m刀,问切成后最大段的最小值及其方案数. ...
- BZOJ 1044: [HAOI2008]木棍分割
Description 求 \(n\) 根木棍长度为 \(L\) ,分成 \(m\) 份,使最长长度最短,并求出方案数. Sol 二分+DP. 二分很简单啊,然后就是方案数的求法. 状态就是 \(f[ ...
- bzoj 1044: [HAOI2008]木棍分割【二分+dp】
对于第一问二分然后贪心判断即可 对于第二问,设f[i][j]为已经到j为止砍了i段,转移的话从$$ f[i][j]=\sigema f[k][j-1] (s[j]-s[k-1]<=ans) 这里 ...
- 1044: [HAOI2008]木棍分割
1044: [HAOI2008]木棍分割 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2161 Solved: 779[Submit][Statu ...
随机推荐
- adjacent cache line prefetch
adjacent cache line prefetch 预读取邻近的缓存数据. 计算机在读取数据时,会智能的认为要读取的数据旁边或邻近的数据也是需要的, 那么其在处理的时候就会将这些邻近的数据预先读 ...
- LINUX系统运行查看
1.查看内存使用情况 free -m 2.查看内存,cpu等使用情况排序,使用ps -aux命令 ps -aux --sort=+rss :按内存升序排列 ps -aux --sort=-rss :按 ...
- forever让nodejs后台运行
nodejs一般是当成一条用户命令执行的,当用户断开客户连接,运用也就停了,很烦人.如何让nodejs应用当成服务,在后台执行呢? 最简单的办法: $ nohup node app.js 但是,for ...
- Codeforces Round #363 (Div. 2) A、B、C
A. Launch of Collider time limit per test 2 seconds memory limit per test 256 megabytes input standa ...
- No toolchains found in the NDK toolchains folder for ABI with prefix
通过Android Studio 的Sdk Manager安装NDK,安装完之后编译失败,报错信息如下: No toolchains found in the NDK toolchains folde ...
- HTTP Status 500 - javax.el.PropertyNotFoundException: Property 'lkmId' not found on type cn.itcast.entity.LinkMan
报错 type Exception report message javax.el.PropertyNotFoundException: Property 'lkmId' not found on t ...
- 018对象——对象 get_class get_declared_classes get_declared_interfaces
<?php /** * 对象 get_class get_declared_classes get_declared_interfaces */ //get_class() 获得对象的类名,区分 ...
- C#—序列化(Serialize)和反序列化(NonSerialize)
(转自:http://www.cnblogs.com/Abel-Zhang/p/Serialize.html) 一.概述 序列化是把对象转变成流.相反的过程就是反序列化. 哪些场合用到这项技术呢? 1 ...
- 最新Mysql5.7安装教程
可以从MSQL官网下载MySQL服务器安装软件包,我下载为版本“mysql-installer-community-5.7.3.0-m13.msi”不多说 方法/步骤 1 双击进入安装,如下图: ...
- sql如何分组选择显示最新的一条数据
怎样在数据库的一个表里筛选出每一人的时间最新的一条记录?用SQL语句 wenchuan408 wenchuan408 结帖率:100% sql数据库 yhh name ...