CF321E Ciel and Gondolas
题意:给定序列,将其分成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的更多相关文章
- CF321E Ciel and Gondolas Wqs二分 四边形不等式优化dp 决策单调性
LINK:CF321E Ciel and Gondolas 很少遇到这么有意思的题目了.虽然很套路.. 容易想到dp \(f_{i,j}\)表示前i段分了j段的最小值 转移需要维护一个\(cost(i ...
- CF321E Ciel and Gondolas 【决策单调性dp】
题目链接 CF321E 题解 题意:将\(n\)个人分成\(K\)段,每段的人两两之间产生代价,求最小代价和 容易设\(f[k][i]\)表示前\(i\)个人分成\(k\)段的最小代价和 设\(val ...
- [CF321E]Ciel and Gondolas&&[BZOJ5311]贞鱼
codeforces bzoj description 有\(n\)个人要坐\(k\)辆车.如果第\(i\)个人和第\(j\)个人同坐一辆车,就会产生\(w_{i,j}\)的代价. 求最小化代价.\( ...
- CF321E Ciel and Gondolas & BZOJ 5311 贞鱼
一眼可以看出$O(kn^{2})$的$dp$方程,然后就不会了呜呜呜. 设$f_{i, j}$表示已经选到了第$i + 1$个数并且选了$j$段的最小代价,那么 $f_{i, j} = f_{p, j ...
- 【wqs二分 || 决策单调性】cf321E. Ciel and Gondolas
把状态看成层,每层决策单调性处理 题目描述 题目大意 众所周知,贞鱼是一种高智商水生动物.不过他们到了陆地上智商会减半.这不?他们遇到了大麻烦!n只贞鱼到陆地上乘车,现在有k辆汽车可以租用.由于贞鱼们 ...
- 【BZOJ5311/CF321E】贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性)
[BZOJ5311/CF321E]贞鱼/Ciel and Gondolas(动态规划,凸优化,决策单调性) 题面 BZOJ CF 洛谷 辣鸡BZOJ卡常数!!!!!! 辣鸡BZOJ卡常数!!!!!! ...
- 【23.58%】【code forces 321E】Ciel and Gondolas
time limit per test4 seconds memory limit per test512 megabytes inputstandard input outputstandard o ...
- 【CodeForces】【321E】Ciel and Gondolas
DP优化/四边形不等式 这题……跟邮局那题简直一模一样吧……好水的E题…… 设dp[i][j]表示前 i 艘“gondola”坐了前 j 个人,那么方程即为$dp(i,j)=min\{ dp[i-1] ...
- CodeForces - 321E:Ciel and Gondolas (四边形不等式优化DP)
题意:N个人排成一行,分成K组,要求每组的不和谐值之和最小. 思路:开始以为是斜率优化DP,但是每个区间的值其实已经知道了,即是没有和下标有关的未知数了,所以没必要用斜率. 四边形优化. dp[i][ ...
随机推荐
- .NET Standard库引用导致的FileNotFoundException探究
微软近几年推出.NET Standard,将.NET Framework,.NET Core,Xamarin等目标平台的api进行标准化和统一化,极大地方便了类库编写人员的工作.简单的说,类库编写人员 ...
- Jmeter(三十)_TimeShift函数在JSR223中的使用
今天学习一下TimeShift函数在JSR223中的使用方法. 关联之前的一篇时间戳文章:Jmeter(十二)_打印时间戳 首先,创建线程组,在线程组下面创建一个JSR223采样器 选择Groovy语 ...
- 第六周-总结&结对编程
1.结对编程 结对编程的Partner依旧是郑蕊师姐(博客:http://www.cnblogs.com/zhengrui0452/) 我们一起改进的是郑蕊师姐做的“四则运算” 郑蕊师姐之前完成四则运 ...
- Linux内核分析 读书笔记 (第十八章)
第十八章 调试 18.1 准备开始 1. 需要的只是: 一个bug 一个藏匿bug的内核版本 相关内核代码的知识和运气 2. 在跟踪bug的时候,掌握的信息越多越好. 18.2 内核中的bug 1. ...
- <软件体系结构>实验框架选择及其说明
一.框架选择 本次实验,我所采取的框架是SSH框架.那么首先,我想简单的说明一下SSH框架,一方面给自己复习一下知识,另一方面也能使自己在以后看这篇博客的时候不至于太费力. SSH不是一个框架,而是S ...
- Disabling Chrome cache for website development
https://stackoverflow.com/questions/5690269/disabling-chrome-cache-for-website-development https://s ...
- [转帖] ASP ASPX 等知识
asp.asp.net..aspx..ascx..ashx的简单说明 https://www.cnblogs.com/jhcelue/p/6736147.html ASP是动态server页面(Act ...
- Linux环境(CentOS)安装维护过程中用到的常见命令
1. yum 安装时需要选择仓库 一般的路径 /etc/repos.d/ 2. 查看安装了哪些软件的 yum list |grep docker installed 的就是已经安装的软件. 3. 卸载 ...
- static方法
http://www.cnblogs.com/dolphin0520/p/3799052.html 方便在没有创建对象的情况下来进行调用(方法/变量). 虽然在静态方法中不能访问非静态成员方法和非静态 ...
- 在保存Bitmap的时候出现“GDI出现一般性错误”
今天开发的时候出现过一个非常奇怪的问题,在保存最终的Bitmap图片的时候,明明使用Directory.Exist(filePath)函数判断当前路径的时候,这些路径都是有用的并且都是合法的,但是就是 ...