题意:给定序列,将其分成k段。如果[l, r]在一段,那么每对不相同的i,j∈[l, r]都会有ai,j的代价。求最小总代价。

解:提供两种方案。第三种去bzoj贞鱼的n²算法。

决策单调性优化:

对于两个转移点j1 < j2,若在某个点i上j2更优,则i后面的j2全部更优。这就是决策单调性。

有两种写法。一种是维护决策栈(???),我自己YY了一个线段树写法WA飞了。

还有一种是分治。对于一段待转移的区间[l, r],它们的最优转移来自于[L, R]

则对于mid = (l + r) >>1,我们扫一遍[L, R],得到mid的最优转移p

然后分治下去。

 #include <cstdio>
#include <cstring> const int N = , K = , INF = 0x3f3f3f3f; inline void read(int &x) {
x = ;
char c = getchar();
while(c < '' || c > '') {
c = getchar();
}
while(c >= '' && c <= '') {
x = (x << ) + (x << ) + c - ;
c = getchar();
}
return;
} int f[N][K], n, k, a[N][N];
int tag[N], turn; inline void exmin(int &a, int b) {
a > b ? a = b : ;
return;
} void solve(int L, int R, int l, int r) {
if(R < L || r < l) return;
//printf("solve %d %d -> %d %d \n", L, R, l, r);
if(L == R) {
for(int i = l; i <= r; i++) {
f[i][turn] = f[R][turn - ] + a[i][R + ];
//printf("f %d %d = %d + %d \n", i, turn, f[R][turn - 1], a[i][R + 1]);
}
return;
}
int mid = (l + r) >> , p = L;
for(int i = L; i < mid && i <= R; i++) {
if(f[mid][turn] > f[i][turn - ] + a[mid][i + ]) {
p = i;
f[mid][turn] = f[i][turn - ] + a[mid][i + ];
//printf("f %d %d = %d from %d \n", mid, turn, f[mid][turn], p);
}
}
solve(L, p, l, mid - );
solve(p, R, mid + , r);
return;
} int main() { //freopen("in.in", "r", stdin);
//freopen("my.out", "w", stdout); read(n); read(k);
for(register int i = ; i <= n; i++) {
for(register int j = ; j <= n; j++) {
read(a[i][j]);
if(i < j) a[i][j] = ;
}
}
for(register int i = ; i <= n; i++) {
for(register int j = n; j >= ; j--) {
a[i][j] += a[i][j + ];
}
}
for(register int i = ; i <= n; i++) {
for(register int j = n; j >= ; j--) {
a[i][j] += a[i - ][j];
}
}
memset(f, 0x3f, sizeof(f));
f[][] = ;
for(int j = ; j <= k; j++) {
turn = j;
//printf("turn = %d \n", j);
solve(, n - , , n);
/*for(int i = 1; i <= n; i++) {
printf("%d ", f[i][turn]);
}
printf("\n");*/
} printf("%d\n", f[n][k]);
return ;
}

决策单调性优化AC代码

带权二分:我们假装那个函数是凸的。

然后按照套路带权二分一波。

记得一定要让k的变化和D的变化同步,这一点可以通过调整±D来实现。

之后尽量让k小,l端mid,r端要mid - 1。

 #include <cstdio>
#include <algorithm> typedef long long LL;
const int N = ;
LL INF = 1e17; inline void read(LL &x) {
x = ;
char c = getchar();
while(c < '' || c > '') {
c = getchar();
}
while(c >= '' && c <= '') {
x = (x << ) + (x << ) + c - ;
c = getchar();
}
return;
} int n, k, g[N];
LL f[N], a[N][N], D, ans; inline int check(LL mid) {
D = mid;
for(register int i = ; i <= n; i++) {
f[i] = INF;
for(register int j = ; j < i; j++) {
if(f[i] > f[j] + a[i][j + ] - D) {
f[i] = f[j] + a[i][j + ] - D;
g[i] = g[j] + ;
}
else if(f[i] == f[j] + a[i][j + ] - D) {
g[i] = std::min(g[i], g[j] + );
}
}
}
ans = f[n];
return g[n];
} int main() {
scanf("%d%d", &n, &k);
for(register int i = ; i <= n; i++) {
for(register int j = ; j <= n; j++) {
read(a[i][j]);
if(i < j) a[i][j] = ;
}
}
for(register int i = ; i <= n; i++) {
for(register int j = n; j >= ; j--) {
a[i][j] += a[i][j + ];
}
}
for(register int i = ; i <= n; i++) {
for(register int j = n; j >= ; j--) {
a[i][j] += a[i - ][j];
}
}
// LL l = -a[n][], r = a[n][];
while(l < r) {
LL mid = (l + r + ) >> ;
int t = check(mid);
if(t == k) {
printf("%lld\n", ans + k * mid);
return ;
}
if(t < k) l = mid;
else r = mid - ;
}
check(r);
printf("%lld\n", ans + k * r);
return ;
}

带权二分AC代码

CF321E Ciel and Gondolas的更多相关文章

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

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

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

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

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

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

  4. CF321E Ciel and Gondolas & BZOJ 5311 贞鱼

    一眼可以看出$O(kn^{2})$的$dp$方程,然后就不会了呜呜呜. 设$f_{i, j}$表示已经选到了第$i + 1$个数并且选了$j$段的最小代价,那么 $f_{i, j} = f_{p, j ...

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

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

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

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

  7. 【23.58%】【code forces 321E】Ciel and Gondolas

    time limit per test4 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...

  8. 【CodeForces】【321E】Ciel and Gondolas

    DP优化/四边形不等式 这题……跟邮局那题简直一模一样吧……好水的E题…… 设dp[i][j]表示前 i 艘“gondola”坐了前 j 个人,那么方程即为$dp(i,j)=min\{ dp[i-1] ...

  9. CodeForces - 321E:Ciel and Gondolas (四边形不等式优化DP)

    题意:N个人排成一行,分成K组,要求每组的不和谐值之和最小. 思路:开始以为是斜率优化DP,但是每个区间的值其实已经知道了,即是没有和下标有关的未知数了,所以没必要用斜率. 四边形优化. dp[i][ ...

随机推荐

  1. 配置Nginx反向代理WebSocket,以代理noVNC为例

    什么是Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器. Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮 ...

  2. python基础学习笔记(十二)

    模块 前面有简单介绍如何使用import从外部模块获取函数并且为自己的程序所用: >>> import math >>> math.sin(0) #sin为正弦函数 ...

  3. DrangonBorns

    团队介绍 团队名称:DrangonBorns(龙裔)      团队博客:http://www.cnblogs.com/DragonBorns/     团队队长:蒲建国     队长博客链接:htt ...

  4. Docker for windows 入门一(下载安装)

    预安装条件,可以查阅官方文档,本人是Win10 x64(必要条件)教育版+开启Hyper-V(Feature特性),具体可参考云栖社区的文章: https://yq.aliyun.com/articl ...

  5. MySql绿色版安装配置

    首先从官网下载MySQL的安装文件:http://dev.mysql.com/downloads/file.php?id=456318(直接选择No thanks, just start my dow ...

  6. Entity Framwork学习笔记

    一.First Demo

  7. Angular injector注入器

    <!DOCTYPE html><html ng-app="myApp"><head lang="en"> <meta ...

  8. 二本毕业,我是如何逆袭成为BAT年薪40W的Java工程师的?

    身边的师弟师妹经常问到:非计算机专业出身,你是在2年内如何逆袭成BAT年薪40W的资深开发工程师的.其实很简单——努力! 我16年毕业于普通的二本学校,非计算机专业出身,只因为对软件开发感兴趣,所以找 ...

  9. js screen

    windows.screen對象包含包含對象屏幕的信息: screen.availheight;屏幕高度 screen.availwidth;屏幕寬度

  10. Java之Array(数组)说明

    代码说明: package array; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** ...