题意

题目链接

Sol

比较套路的一个题。

第一问二分答案check一下

第二问设\(f[i][j]\)表示前\(i\)个数,切了\(j\)段的方案数,单调队列优化一下。

转移的时候只需要保证当前段的长度小于最大限度即可。

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 50001, mod = 10007;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-')f =- 1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, a[MAXN], sum[MAXN];
int check(int val) {
int tot = 0, pre = 0;
for(int i = 1; i <= N; i++) {
if(sum[i] - sum[pre] > val) {
if((sum[i - 1] - sum[pre] <= val) && a[i] <= val) tot++, pre = i - 1;
else return 0;
}
}
return tot <= M;
}
int solve1() {
int l = 0, r = sum[N], ans;//二分最大长度
while(l <= r) {
int mid = l + r >> 1;
if(check(mid)) ans = mid, r = mid - 1;
else l = mid + 1;
}
return printf("%d ", ans), ans;
}
int add(int x, int y) {
if(x + y < 0) return x + y + mod;
else return (x + y > mod ? x + y - mod : x + y);
}
int solve2(int mx) {
static int f[MAXN], g[MAXN], q[MAXN], ans = 0;
// f[0][0] = 1;
for(int i = 1; i <= N; i++) g[i] = (sum[i] <= mx);
for(int j = 1; j <= M; j++) {
for(int i = 1, h = 1, t = 0, s = 0; i <= N; i++) {
while(h <= t && (sum[i] - sum[q[h]] > mx)) s = add(s, -g[q[h++]]);
q[++t] = i;
f[i] = s; s = add(s, g[i]);
/* for(int k = i - 1; k >= 1; k--) {
if(sum[i] - sum[k] <= mx) (f[i][j] += f[k][j - 1]) %= mod;
else break;
}*/
}
ans = add(ans, f[N]);
memcpy(g, f, sizeof(g));
}
return ans % mod;
}
int main() {
// freopen("10.in", "r", stdin);
N = read(); M = read();
for(int i = 1; i <= N; i++) a[i] = read(), sum[i] = sum[i - 1] + a[i];
printf("%d", solve2(solve1()));
}

BZOJ1044: [HAOI2008]木棍分割(dp 单调队列)的更多相关文章

  1. [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  2. bzoj1044[HAOI2008]木棍分割 单调队列优化dp

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4314  Solved: 1664[Submit][Stat ...

  3. BZOJ1044 [HAOI2008]木棍分割 【二分+Dp】

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4281  Solved: 1644 [Submit][St ...

  4. [BZOJ1044][HAOI2008]木棍分割 二分+贪心+dp+前缀和优化

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 4112  Solved: 1577 [Submit][St ...

  5. BZOJ1044: [HAOI2008]木棍分割

    1044: [HAOI2008]木棍分割 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1580  Solved: 567[Submit][Statu ...

  6. 【czy系列赛】czy的后宫6 && bzoj1044 [HAOI2008]木棍分割

    题目描述 众所周知的是丧尸czy有很多妹子(虽然很多但是质量不容乐观QAQ),今天czy把n个妹子排成一行来检阅.但是czy的妹子的质量实在--所以czy看不下去了.检阅了第i个妹子会增加czy a[ ...

  7. [bzoj1044][HAOI2008][木棍分割] (二分+贪心+dp+队列优化)

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  8. bzoj1044: [HAOI2008]木棍分割 二分+dp

    有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长度最小, 并且输出有多少 ...

  9. bzoj1044 [HAOI2008]木棍分割——前缀和优化DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1044 咳咳...终于A了... 居然没注意到正着找pos是n方会TLE...所以要倒着找po ...

随机推荐

  1. vue axios ajax引擎

    0.调用 1.axios api axios.request(config) axios.get(url[,config]) axios.delete(url[,config]) axios.head ...

  2. iOS自定义相机

    1.首先声明以下对象 #import <AVFoundation/AVFoundation.h> //捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入) @property (no ...

  3. Javaweb 实现分页功能

    package cn.zr.testpage.entity; public class User { private String name; private int age; private Str ...

  4. Solr学习笔记(2) —— Solr管理索引库

    一.维护索引 1.1 添加/更新文档 1.2 批量导入数据(使用dataimport) 第一步:把mysql的数据驱动.以及dataimport插件依赖的jar包添加到solrcore(collect ...

  5. html 一些坑。。。

    margin-left 和 margin-right 才能够使用 auto top 和 bottom 不可以 在网页设计中...通常给img 父容器 一个 宽度...同时 ,指定 img width= ...

  6. Codeforces Round #335 (Div. 2) A

    A. Magic Spheres time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  7. 面向对象之-------------------永不停机的ATM

    import os class Account: def __init__(self, username, password, money=0): self.username = username s ...

  8. python 元组拾遗

    python 元组拾遗 python 语法糖 def printall(*args):  return args  一个以 * 开头的参数将参数聚集为一个元组. printall函数可以接收任意个数的 ...

  9. NETCORE openSUSE docker 安装

    openSUSE docker 安装https://www.jianshu.com/p/c725a06447d5 zypper命令使用示例https://www.cnblogs.com/linuxpr ...

  10. inode与block知识总结

    inode概述:硬盘要分区,然后格式化,创建文件系统在每个Linux存储设备的分区被格式化为ext3文件系统后一般有两个部分:    第一部分Inode:存储这些数据的属性信息(大小,属主,归属的用户 ...