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][ ...
随机推荐
- Spring+SpringMVC+MyBatis+easyUI整合进阶篇(十二)Spring集成Redis缓存
作者:13 GitHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...
- Reactjs-JQuery-Omi-Extjs-Angularjs对比
写在前面 前端越来越混乱了,当然也可以美其名曰:繁荣. 当新启动一个前端项目,第一件事就是纠结:使用什么框架,重造什么轮子? 那么,希望看完此篇,能够给你一个清晰的认识,或者让你更加地纠结和无所适从 ...
- 个人阅读作业LAST
其实从最刚开始到最后,我们团队的任务一直都比较紧,前期主要是因为我们是从零开始的自选题目,一开始大家都有许多不曾用过的技术需要学习,PM安排任务时也不好分配,不过大家也都坚持下来尽量按时完成任务,第一 ...
- java-过滤器、拦截器
1.基础知识 1.1面向对象编程(OOP).面向切面编程(AOP) 面向对象编程: 将需求功能划分为不同的.相对独立的和封装良好的类,使他们有属于自己的行为,依靠继承和多态等来定义彼此的关系. 面向切 ...
- Orcle安装环境及步骤
Windows7环境下如何成功安装Oracle数据库 随着微软新一代操作系统 Windows7 的正式发行,使用 Windows7 的朋友也越来越多,很多人在 Windows7 环境下安装 ...
- 5.1 四则运算单元测试j
由于上个星期请假没上课,这个星期回来才知道作业,时间比较赶,个人能力又不足,作业质量不是很好 Calculator.java import java.util.Scanner; public clas ...
- SPRINT四则运算(第二天)
1.小组成员: 李豌湄:master 江丹仪:产品负责人 2.现状: a.已经下载APP分析他们的界面.优缺点和闪光点 b.已改进代码添加功能 3.任务认领: 完成任务的第一个模块: a.下载五个类 ...
- 查询部门----返回给前台TreeView数据格式的数据
实体类: public class AddressTreeDto { private Long id; private String text;//位置名称 private Long pId;//上一 ...
- GitLab添加ssh-key,操作无需每次输入账号密码
git config --global credential.helper store 然后操作pull/push 会让输入用户名密码,第一次输入进去.下次再操作pull/push时就不需要输入用户名 ...
- linux_目录基本操作
ls命令 ls命令用来显示目标列表,在Linux中是使用率较高的命令.ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件. 语法 $ ls [选项] [目录] 选项 说明 -a 显示所有档案 ...