一眼可以看出$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. 进程、线程、ThreadLlocal

    1.线程是最小的执行单位,而进程中至少一个线程组:如果调度进程和线程,完全由操作系统决定,程序自己不能决定什么时候执行,执行多长时间 Unix/Linux操作系统提供了一个fork()系统调用,它非常 ...

  2. Git 版本管理工具(一)

    转自:http://blog.csdn.net/ithomer/article/details/7527877 Git 是一个分布式版本控制工具,它的作者 Linus Torvalds 是这样给我们介 ...

  3. nodejs express mysql

  4. 记一次内存溢出的分析经历——使用thrift

    背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...

  5. python 修改文件内容

    python 修改文件内容 一.修改原文件方式 1 def alter(file,old_str,new_str): 2 """ 3 替换文件中的字符串 4 :param ...

  6. [转载]Ubuntu下ssh服务的安装与登陆(ssh远程登陆)

    转载地址:http://blog.csdn.net/zht666/article/details/9340633 Ubuntu默认并没有安装ssh服务,如果通过ssh远程连接到Ubuntu,需要自己手 ...

  7. java代码从键盘输入执行次数,数,然后排序

    总结:实现从键盘控制执行次数,困惑我很久,直到昨日在提问时,网友说通过循环是肯定可以的所以顿悟了 package com.c2; import java.util.Arrays; import jav ...

  8. 2015 浙江省赛 H - May Day Holiday

    H - May Day Holiday As a university advocating self-learning and work-rest balance, Marjar Universit ...

  9. DataGridView上下方向键定位

    /// <summary> /// DataGridView上下方向键定位 /// </summary> /// <param name="dgv"& ...

  10. 2015.2.27 UltraEdit中显示XML结构

    1选择菜单项 "视图"->"显示方式(着色文件类型)"->"XML": 2选择菜单项 "格式"->&q ...