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 ...
随机推荐
- [转]Markdown 公式指导手册(包含LaTeX)
Cmd Markdown 公式指导手册 本文为转载文章,并且由于LaTeX的可能不能全部兼容,所以可能有部分公式无法在博客园显示,可以移步原网站. 本文固定链接: https://www.zybulu ...
- LeetCode第[33]题(Java):Search in Rotated Sorted Array
题目:在翻转有序中搜索 难度:Medium 题目内容: Suppose an array sorted in ascending order is rotated at some pivot unkn ...
- 使用mybatis如果类属性名和数据库中的属性名不一样取值就会为null
使用mybatis时如果类属性名和数据库中的属性名不一样取值就会为null 这是不能再去改变javabean中的属性,只能改变sql语句.语句如下所示: <select id="sel ...
- 智课雅思词汇---二十四、形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory
智课雅思词汇---二十四.形容词后缀-al-ial-ar-ary-ic-id-ish-ile-ine-oid-ory 一.总结 一句话总结: 1.形容词后缀-al? autumnal 英 [ɔː'tʌ ...
- 解决Python字符串处理出现错误UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 108: ordinal not in range(128)
今天做课程设计遇到了和数据库交互的地方,sqlite数据库设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是Python的str默认是ascii编码,搜集网上的资 ...
- 【C#基本功】1》panel的C#用法 panel
上面截图是panel在labview中的用法,在labview中panel加动态调用技术可以解决很多难题. 对于刚刚接触C#的我来说,如何实现pannel动态加载界面,也是一个必须首要克服的难点. 经 ...
- 第二章 Burp Suite代理和浏览器设置
Burp Suite代理工具是以拦截代理的方式,拦截所有通过代理的网络流量,如客户端的请求数据.服务器端的返回信息等.Burp Suite主要拦截http和https协议的流量,通过拦截,Burp S ...
- Windows Desktop Optimization.bat
界面: github: https://github.com/m2nlight/WindowsDesktopOptimization Config Service [Disabled] Windows ...
- ubuntu定时执行任务——crontab的使用
先补上几个链接,后续再总结 #参考# http://www.cnblogs.com/kaituorensheng/p/4494321.html http://blogread.cn/it/articl ...
- 004——VUE中的v-once的使用
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...