HAOI2008 木棍分割 二分答案 前缀和优化 单调队列 滚动数组
来源:互联网 发布:潮汕女孩知乎 编辑:程序博客网 时间:2024/05/21 14:06
NKOJ4244 HAOI2008 木棍分割
问题描述
有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少种砍的方法使得总长度最大的一段长度最小. 并将结果mod 10007
输入格式
第一行有2个数n,m. 接下来n行每行一个正整数Li,表示第i根木棍的长度.
输出格式
2个数, 第一个数是总长度最大的一段的长度最小值, 第二个数是有多少种砍的方法使得满足条件.
样例输入
3 2
1 1 10
样例输出
10 2
样例说明
两种砍的方法: (1)(1)(10)和(1 1)(10)
数据范围
n<=50000, 0<=m<=min(n-1,1000).
1<=Li<=1000.
这道题的综合性比较强。考察了很多知识点,尤其是对于优化的考察。但是其实并没有太复杂。
第一个问题,“长度最大的最小”,显然的二分答案标志。轻松水过。
第二个问题,考虑递推。定义状态
所以我们需要优化。滚动数组的优化是很容易想到的,因为注意到
递推式里面有多个连续的数求和的形式,考虑前缀和优化。但是这里有个问题:如何定位
优化之后,时间复杂度
代码:
#include<stdio.h>using namespace std;const int mod=10007,MAXN=50005;int N,M,Ans,sum[MAXN],Max,f[MAXN],sumf[MAXN][2];int Q[MAXN],head,tail;inline int _R(){ char s=getchar();int v=0,sign=0; while((s!='-')&&(s>57||s<48))s=getchar(); if(s=='-')sign=1,s=getchar(); for(;s>47&&s<58;s=getchar())v=v*10+s-48; if(sign)v=-v; return v;}bool check(int x){ int cnt=0,i,las=0; for(i=1;i<=N;i++) { if(sum[i]-sum[las]>x) { cnt++; las=i-1; } if(cnt>M)return false; } return true;}int main(){ int L,R=0,mid,i,j,x,y,t; N=_R();M=_R(); for(i=1;i<=N;i++) { x=_R(),sum[i]=sum[i-1]+x; Max=Max<x?x:Max; } L=Max;R=sum[N]; while(L<=R) { mid=L+R>>1; if(check(mid))R=mid-1; else L=mid+1; } printf("%d ",L); for(i=1;i<=N;i++) { if(sum[i]<=L)f[i]=1; sumf[i][1]=sumf[i-1][1]+f[i]; } Ans+=f[N]; for(j=1;j<=M;j++) { head=0; x=j&1;y=x^1; for(i=1;i<=N;i++) { while(sum[i]-sum[head]>L)head++; t=head; if(t)t--; f[i]=(sumf[i-1][x]-sumf[t][x])%mod; sumf[i][y]=(sumf[i-1][y]+f[i])%mod; } Ans=(Ans+f[N])%mod; } printf("%d",(Ans+mod)%mod);}
阅读全文
0 0
- HAOI2008 木棍分割 二分答案 前缀和优化 单调队列 滚动数组
- NKOJ 4244 (HAOI 2008) 木棍分割 (二分答案+DP+单调队列+前缀和优化+滚动数组)
- 1044: [HAOI2008]木棍分割 二分答案+DP+前缀和优化
- BZOJ 1044: [HAOI2008]木棍分割 DP,前缀和优化,二分答案
- 【BZOJ1044】【tyvj3511】【codevs1870】木棍分割,二分答案+滚动数组+前缀和DP
- bzoj1044: [HAOI2008]木棍分割(二分+单调队列)
- [BZOJ1044]HAOI2008木棍分割|DP|二分答案
- BZOJ1044 [HAOI2008]木棍分割(二分答案/单调性优化dp+递推优化)
- BZOJ 1044 HAOI2008 木棍分割 二分答案+动态规划
- BZOJ 1044: [HAOI2008]木棍分割|动态规划|二分答案
- bzoj 1044: [HAOI2008]木棍分割 二分答案+动态规划
- BZOJ 1044: [HAOI2008]木棍分割(二分答案+DP)
- bzoj1044 [HAOI2008]木棍分割(滚动+后缀和)
- 【BZOJ1044】【HAOI2008】木棍分割 二分+动规
- bzoj1044[HAOI2008]木棍分割 动态规划+二分
- BZOJ 1044: [HAOI2008]木棍分割 二分 dp
- BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】
- [HAOI2008]木棍分割
- SQL判断查询结果是否存在EXISTS
- http状态码
- ubuntu下编译caffe-ssd
- Sublime Text快捷键
- 关于UTC时间的转本地时间
- HAOI2008 木棍分割 二分答案 前缀和优化 单调队列 滚动数组
- 第3章 异步I/O
- 矩阵快速幂
- EventBus,Gson打包混淆问题
- Java中PriorityQueue的排序,堆排序
- 动态代理代码段
- Lock和synchronized比较详解
- 小白算法练习 树状dp caioj 二分苹果树
- 机器学习(4)-理解SVM的损失函数和梯度表达式的实现+编程总结