【wqs二分 || 决策单调性】cf321E. Ciel and Gondolas
时间:2019-08-06
本文章向大家介绍【wqs二分 || 决策单调性】cf321E. Ciel and Gondolas,主要包括【wqs二分 || 决策单调性】cf321E. Ciel and Gondolas使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
把状态看成层,每层决策单调性处理
题目描述
题目大意
众所周知,贞鱼是一种高智商水生动物。不过他们到了陆地上智商会减半。
这不?他们遇到了大麻烦!
n只贞鱼到陆地上乘车,现在有k辆汽车可以租用。
由于贞鱼们并不能在陆地上自由行走,一辆车只能载一段连续的贞鱼。
贞鱼们互相有着深深的怨念,每一对贞鱼之间有怨气值。
第i只贞鱼与第j只贞鱼的怨气值记为Yij,且Yij=Yji,Yii=0。
每辆车载重不限,但是每一对在同辆车中的贞鱼都会产生怨气值。
当然,超级贞鱼zzp长者希望怨气值的总和最小。
不过他智商已经减半,想不出分配方案。
他现在找到了你,请你帮助他分配贞鱼们,并输出最小怨气值之和ans。
n<=4000,1 ≤ k ≤min(n , 800)
题目分析
做法一:wqs二分
这个题第一眼就像是wqs二分,并且答案函数的确是一个凸函数的形状。
于是首先是个wqs二分的模板题。
1 #include<bits/stdc++.h> 2 typedef long long ll; 3 const int maxn = 4035; 4 const int INF = 0x3f3f3f3f; 5 6 int n,k,L,R; 7 ll a[maxn][maxn],g[maxn][maxn],f[maxn],h[maxn],ans; 8 9 char tc(){static char tr[1000000],*A=tr,*B=tr;return A==B&&(B=(A=tr)+fread(tr,1,1000000,stdin),A==B)?EOF:*A++;} 10 #define getchar tc 11 int read() 12 { 13 char ch = getchar(); 14 int num = 0, fl = 1; 15 for (; !isdigit(ch); ch=getchar()) 16 if (ch=='-') fl = -1; 17 for (; isdigit(ch); ch=getchar()) 18 num = (num<<1)+(num<<3)+ch-48; 19 return num*fl; 20 } 21 ll check(int w) 22 { 23 memset(f, 0x3f3f3f3f, sizeof f); 24 memset(h, 0x3f3f3f3f, sizeof h); 25 f[0] = h[0] = 0; 26 for (int i=1; i<=n; i++) 27 for (int j=0; j<i; j++) 28 if (f[i] > f[j]+g[j+1][i]+w||(f[i]==f[j]+g[j+1][i]+w&&h[j]+1 < h[i])){ 29 f[i] = f[j]+g[j+1][i]+w, h[i] = h[j]+1; 30 } 31 if (h[n] <= k) ans = f[n]-k*w; 32 return h[n]; 33 } 34 int main() 35 { 36 n = read(), k = read(); 37 for (int i=1; i<=n; i++) 38 for (int j=1; j<=n; j++) a[i][j] = read(); 39 for (int i=n; i>=1; i--) 40 for (int j=i; j<=n; j++) 41 g[i][j] = g[i+1][j]+g[i][j-1]-g[i+1][j-1]+a[i][j]; 42 ans = INF, L = 0, R = g[1][n]; 43 for (int mid=(L+R)>>1; L<=R; mid=(L+R)>>1) 44 if (check(mid) <= k) R = mid-1; 45 else L = mid+1; 46 printf("%lld\n",ans); 47 return 0; 48 }
做法二:决策单调性
$n^2$dp是$f[j][i]$表示前$i$个鱼分为$j$组的最小代价。对于每一个同样的$j$,其转移是具有单调性的。那就是说把$i$视作层,剩下的就是层之间的转移。
暂时还没写。
END
原文地址:https://www.cnblogs.com/antiquality/p/11311625.html
- Spark Streaming编程指南
- Spark源码系列(八)Spark Streaming实例分析
- “震网三代”(CVE-2017-8464)的几种利用方法与防范
- Spark1.0新特性-->Spark SQL
- 挖洞经验 | 看我如何综合利用4个漏洞实现GitHub Enterprise 远程代码执行
- Spark的机器学习算法mlib的例子运行
- Spark Streaming自定义Receivers
- 利用USB橡皮鸭在目标机器上启动Empire或Meterpreter会话
- Spark部署
- Spark调优
- perl语言十分钟入门【零基础可入】
- Spark硬件配置推荐
- Spark作业调度
- 如何把Photoshop改造成远程控制工具(RAT)来利用
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法