题意:给定序列,将其分成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. CentOS上yum方式安装配置LNMP

    实验环境 一台最小化安装的CentOS 7.3虚拟机 安装软件包 yum install -y epel-* yum install -y nginx mariadb-server php php-m ...

  2. Docker inspect - format格式化输出 - 运维笔记

    Docker --format 参数提供了基于 Go模板 的日志格式化输出辅助功能,并提供了一些内置的增强函数. 什么是模板?上图是大家熟悉的 MVC 框架(Model View Controller ...

  3. Python-dict-12

    字典 Why:咱们目前已经学习到的容器型数据类型只有list,那么list够用?他有什么缺点呢? 1. 列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2. 列表只能按照顺序存 ...

  4. 12.18 Daily Scrum

    最近大家确实都很忙,所以所有功能的实现要等到下周.   Today's Task Tomorrow's Task 丁辛 实现和菜谱相关的餐厅列表. 实现和菜谱相关的餐厅列表.             ...

  5. CentOS 7 Install Adobe Flash Player

    From Officail Adobe Flash Site don't down (YUM )adobe-release-x86_64-1.0-1.noarch.rpm,but to downloa ...

  6. jquery的extend方法(源码解析)

    1.前段时间一直忙于研究数据可视化(d3.js,three.js) 以及 php的 laravel框架,生活上也遇到很多事情,这大概就是人生中的迷茫期吧. 回想起,刚出来工作的时候,目标很明确,要学习 ...

  7. [微软官网]windows server 内存限制

    Memory Limits for Windows and Windows Server Releases https://docs.microsoft.com/zh-cn/windows/deskt ...

  8. python使用原始套接字 解析原始ip头数据

    使用底层套接字解码底层流量,是这次做的重点工作. 首先来捕获第一个包 # coding:utf-8import socket # 监听的主机IP host = "192.168.1.100& ...

  9. Linux基础学习(8)--权限管理

    第八章——权限管理 一.ACL权限 1.ACL权限简介与开启: (1)ACL权限简介: (2)查看分区ACL权限是否开启: (3)临时开启分区ACL权限: (4)永久开启分区ACL权限: 2.查看与设 ...

  10. Spring各个jar包的作用

    Spring AOP:Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects:Spring提供的对AspectJ框架的整合Spring Beans:Spring I ...