【BZOJ1044】[HAOI2008]木棍分割

题面

bzoj

洛谷

题解

第一问显然可以二分出来的。

第二问:

设\(dp[i][j]\)表示前\(i\)个,切了\(j\)组的方案数

发现每次转移都是从前面一个区间过来的

直接前缀和优化就好了

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
inline int gi() {
register int data = 0, w = 1;
register char ch = 0;
while (!isdigit(ch) && ch != '-') ch = getchar();
if (ch == '-') w = -1, ch = getchar();
while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
return w * data;
}
const int Mod = 10007;
void pls(int &x, int y) { x += y; if (x >= Mod) x -= Mod; }
void dec(int &x, int y) { x -= y; if (x < 0) x += Mod; }
const int MAX_N = 50005;
int N, M, ans1, ans2, len[MAX_N], L[MAX_N], prv[MAX_N];
bool check(int v) {
int cnt = 0, s = 0;
for (int i = 1; i <= N; i++) {
if (s + len[i] > v) ++cnt, s = len[i];
else s += len[i];
if (cnt > M) return 0;
}
return 1;
}
int solve() {
int l = *max_element(&len[1], &len[N + 1]), r = L[N], res = L[N];
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) r = mid - 1, res = mid;
else l = mid + 1;
}
return res;
}
int sum1[MAX_N], sum2[MAX_N];
int main () {
N = gi(), M = gi();
for (int i = 1; i <= N; i++) L[i] = L[i - 1] + (len[i] = gi());
ans1 = solve();
for (int i = 1; i <= N; i++) {
int l = 1, r = i; prv[i] = i;
while (l <= r) {
int mid = (l + r) >> 1;
if (L[i] - L[mid - 2] <= ans1) prv[i] = mid, r = mid - 1;
else l = mid + 1;
}
}
for (int i = 1, j = 1; i <= N; i++) {
while (L[i] - L[j - 1] > ans1 && j < i) ++j;
if (L[i] - L[j - 1] <= ans1) prv[i] = max(j - 2, 0);
}
for (int i = 1; i <= N; i++) sum1[i] = sum1[i - 1], pls(sum1[i], (L[i] <= ans1));
for (int i = 1; i <= M; i++) {
for (int j = 1; j <= N; j++) sum2[j] = sum1[j - 1], dec(sum2[j], sum1[prv[j]]);
for (int j = 1; j <= N; j++) sum1[j] = sum1[j - 1], pls(sum1[j], sum2[j]);
pls(ans2, sum2[N]);
}
printf("%d %d\n", ans1, ans2);
return 0;
}

最新文章

  1. 代码的坏味道(17)——夸夸其谈未来性(Speculative Generality)
  2. 转【实战体验几种MySQLCluster方案】
  3. 如何用linux命令查看nginx是否在正常运行
  4. windows递归拷贝(或删除等操作)文件
  5. 第14章 使用DHCP动态管理主机地址
  6. CodeIgniter - 集成七牛云存储
  7. 内存泄漏,当您使用的 GetDC 方法和 ReleaseDC 方法 CWnd 类版本
  8. spoj 390
  9. StartService与BindService
  10. 用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
  11. Linux 下挂载新硬盘方法
  12. CentOS6.5上安装MySQL
  13. UE4 IOS 开发之传感器输入
  14. 2 c++对象被使用前要先被初始化
  15. django之创建第2个项目
  16. 验证url的正则
  17. asp.net core 1.1 mysqlsugarCore mysql.data 要 7.0.5.0
  18. 深入浅出CSS:Div(一)
  19. linux 进程通信之 管道和FIFO
  20. 20155330 实验四 Android程序设计

热门文章

  1. ORACLE RAC clusterware/GI 启动诊断流程图11.2+
  2. Falsk的模板分配和蓝图、定制错误信息、 和补充
  3. Linux内核态和用户态
  4. php功能模块学习笔记
  5. Avito Code Challenge 2018
  6. 1.1 What Is This Book About(这本书是关于什么的)
  7. 「GXOI / GZOI2019」与或和
  8. mysql 数据库数据迁移 The user specified as a definer (&#39;root&#39;@&#39;%&#39;) does not exist 解决方法
  9. SQLServer2008导出表数据为SQL脚本
  10. [BJWC2011]最小三角形