一眼可以看出$O(kn^{2})$的$dp$方程,然后就不会了呜呜呜。

设$f_{i, j}$表示已经选到了第$i + 1$个数并且选了$j$段的最小代价,那么

  $f_{i, j} = f_{p, j - 1} + sum(p + 1, i)  (0 \leq p \leq i)$

这个$sum$可以通过把$j > i$的格子的值记为$0$,预处理前缀和得到。

  $sum(x, y) = s_{y, y} - s_{y, x}$

以下全都不是我想出来的:

外层枚举$j$可以划分阶段转移,不容易看出决策具有单调性。具体来说,假设当前要转移到$i$, 对于两个决策点$x$和$y$(假设$x < y$),如果有$f_{x} - s_{i, x} > f_{y} - s_{i, y}$,那么永远都不会用$x$去转移,我们可以在单调队列中二分来维护这个单调性,时间复杂度降至$O(knlogn)$,已经可以通过CF的数据了,但是BZOJ的变态时限是永远不可能把这个复杂度的程序放过去的。

考虑到把$n$个物品划分为$k$段,相当于强制选择$k$个,可以想到wqs二分。(感觉根本理解得不够啊喂喂),这样时间复杂度可以降至$O(n log n log sum)$,就可以AC了。

注意使用超级读优$IOread$。

虽然感觉是一道很好的题,但是考场上看到就等死吧。

Code:

#include <cstdio>
using namespace std; const int N = ; int n, m, s[N][N], f[N], q[N], cnt[N]; namespace IOread{
const int L = <<; char buffer[L],*S,*T; inline char Getchar() {
if(S == T) {
T = (S = buffer) + fread(buffer, , L, stdin);
if(S == T) return EOF;
}
return *S++;
} template <class T>
inline void read(T &X) {
char ch; T op = ;
for(ch = Getchar(); ch > '' || ch < ''; ch = Getchar())
if(ch == '-') op = -;
for(X = ; ch >= '' && ch <= ''; ch = Getchar())
X = (X << ) + (X << ) + ch - '';
X *= op;
} } using namespace IOread; inline int query(int x, int y) {
return s[y][y] - s[y][x];
} inline int calc(int x, int y) {
int ln = y + , rn = n, mid, res = n + ;
for(; ln <= rn; ) {
mid = (ln + rn) / ;
int v1 = f[x] + query(x, mid), v2 = f[y] + query(y, mid);
if(v1 > v2 || (v1 == v2 && cnt[x] > cnt[y])) res = mid, rn = mid - ;
else ln = mid + ;
}
return res;
} inline bool chk(int mid) {
int l = , r = ; q[] = ;
for(int i = ; i <= n; i++) {
for(; l < r && calc(q[l], q[l + ]) <= i; ++l);
f[i] = f[q[l]] + query(q[l], i) + mid;
cnt[i] = cnt[q[l]] + ;
for(; l < r && calc(q[r - ], q[r]) > calc(q[r], i); --r);
q[++r] = i;
}
return cnt[n] <= m;
} int main() {
read(n), read(m);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++) {
read(s[i][j]);
if(j > i) s[i][j] = ;
}
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
s[i][j] += s[i - ][j] + s[i][j - ] - s[i - ][j - ]; int ln = , rn = s[n][n], mid, res = ;
for(; ln <= rn; ) {
mid = (ln + rn) / ;
if(chk(mid)) rn = mid - , res = f[n] - mid * m;
else ln = mid + ;
} printf("%d\n", res);
return ;
}

CF321E Ciel and Gondolas & BZOJ 5311 贞鱼的更多相关文章

  1. BZOJ.5311.贞鱼(DP 决策单调)

    题目链接 很容易写出\(O(n^2k)\)的DP方程.然后显然决策点是单调的,于是维护决策点就可以了.. 这个过程看代码或者别的博客吧我不写了..(其实是忘了) 这样复杂度\(O(nk\log n)\ ...

  2. CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性

    LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...

  3. CF321E Ciel and Gondolas

    题意:给定序列,将其分成k段.如果[l, r]在一段,那么每对不相同的i,j∈[l, r]都会有ai,j的代价.求最小总代价. 解:提供两种方案.第三种去bzoj贞鱼的n²算法. 决策单调性优化: 对 ...

  4. 【wqs二分 || 决策单调性】cf321E. Ciel and Gondolas

    把状态看成层,每层决策单调性处理 题目描述 题目大意 众所周知,贞鱼是一种高智商水生动物.不过他们到了陆地上智商会减半.这不?他们遇到了大麻烦!n只贞鱼到陆地上乘车,现在有k辆汽车可以租用.由于贞鱼们 ...

  5. [CF321E]Ciel and Gondolas&&[BZOJ5311]贞鱼

    codeforces bzoj description 有\(n\)个人要坐\(k\)辆车.如果第\(i\)个人和第\(j\)个人同坐一辆车,就会产生\(w_{i,j}\)的代价. 求最小化代价.\( ...

  6. CF321E Ciel and Gondolas 【决策单调性dp】

    题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...

  7. 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)

    [BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...

  8. 【Codeforces 321E / BZOJ 5311】【DP凸优化】【单调队列】贞鱼

    目录 题意: 输入格式 输出格式 思路: DP凸优化的部分 单调队列转移的部分 坑点 代码 题意: 有n条超级大佬贞鱼站成一行,现在你需要使用恰好k辆车把它们全都运走.要求每辆车上的贞鱼在序列中都是连 ...

  9. BZOJ5311,CF321E 贞鱼

    题意 Problem 5311. -- 贞鱼 5311: 贞鱼 Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 677  Solved: 150[Subm ...

随机推荐

  1. I.MX6 dts 在哪里、怎么编译

    /************************************************************************ * I.MX6 DTS 在哪里.怎么编译 * 说明: ...

  2. 用Java实现异构数据库的高效通用分页查询功能

    不同数据库的分页查询语句有着较大区别,其中MySQL数据的limit offset语法最为简单,而SQL Server数据库和Oracle数据库的分页就比较复杂了. 网上常见的SQL Server和O ...

  3. [基本操作] kd 树

    概念就不说了吧,网上教程满天飞 学了半天才知道,kd 树实质上只干了两件事情: 1.快速定位一个点 / 矩形 2.有理有据地优化暴力 第一点大概是可以来做二维平面上给点/矩形打标记的问题 第二点大概是 ...

  4. OSError: [Errno 22] Invalid argument: 'D:\x07ckup\test.txt'

    使用with open("D:\backup\test.txt","rt") as f:报上面的错误,将上面的语句改成 with open(r"D:\ ...

  5. 一道SQL的面试题之联想

    一道SQL的面试题之联想 本人工作在一家小型的民营企业,主要从事业务系统的日常维护,二次开发,菜鸟一枚.周五经理准备面试两个开发人员,据简历,都还比较不错,让经理产生了想法,于是准备了一套面试题目,给 ...

  6. linux 内核的链表操作(好文不得不转)

    以下全部来自于http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 无任何个人意见. 本文详细分析了 2.6.x 内 ...

  7. BZOJ1293:[SCOI2009]生日礼物

    浅谈队列:https://www.cnblogs.com/AKMer/p/10314965.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?i ...

  8. 在ThinkPHP的common.php文件里添加公共函数的注意事项

    注意事项: 1.函数不要加public访问控制权限,因为默认就是public的. 2.当你写好了一个新函数后在本地运行发现没有问题,但是在生产环境运行会报错:找不到这个函数,解决方法是删除runtim ...

  9. hihoCoder#1068(RMQ-ST算法)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho在美国旅行了相当长的一段时间之后,终于准备要回国啦!而在回国之前,他们准备去超市采购一些当地特产——比如汉堡 ...

  10. JDK 8 - java.util.HashMap 实现机制分析

    官方文档对 HashMap 的定义: public class HashMap<K,V> extends AbstractMap<K,V> implements Map< ...