一眼可以看出$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. Linux-Crontab服务

    1.安装并检查Crontab服务 检查cron服务: 检查Crontab工具是否安装:crontab -l 检查crond服务是否启动:service crond status 安装cron: yum ...

  2. Tomcat 优化方案 和 配置详解

    转载: http://blog.csdn.net/yi2672379417/article/details/51442229

  3. 「BJOI2018」链上二次求和

    「BJOI2018」链上二次求和 https://loj.ac/problem/2512 我说今天上午写博客吧.怕自己写一上午,就决定先写道题. 然后我就调了一上午线段树. 花了2h找到lazy标记没 ...

  4. laravel的批量插入

    在日常开发中,用到批量插入的操作还是挺多的.记得很早很早以前,我还是在循环中写sql插入,结果被项目经理按在地上摩擦.好吧,性能这东西,用不到的时候还好,万一性能成为瓶颈,那代码优化,数据库优化就首当 ...

  5. 获取APK的package名和activity名

    使用 aapt dump badging + 需要安装的APK

  6. 愿天下有情人都是失散多年的兄妹(bfs)

    L2-016. 愿天下有情人都是失散多年的兄妹 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 呵呵.大家都知道五服以内不得通婚 ...

  7. DripRoad(点滴之路)

    关于DripRoad DripRoad 意为点滴之路,程序员之路在于点滴积累!是的,这些积累包括技术能力,沟通能力,业务能力等等.   我 我是唐志伟,2009年一个人来上海,就读于上海医疗器械高等专 ...

  8. SQL基础(2)

    SQL TOP (1)TOP子句 OP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. 注释:并非所有的数据库系统都支持 TOP 子句. (2)SQL S ...

  9. windows服务控制(开启/停止已有服务)

    #include "stdafx.h" #include <windows.h> #include <tchar.h> #include <strsa ...

  10. 常用Oracle分析函数详解

    学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理代表 ...