[Comet OJ - Contest #7 D][52D 2417]机器学习题_斜率优化dp
机器学习题
题目大意:

数据范围:

题解:
学长说是决策单调性?
直接斜率优化就好了嘛
首先发现的是,$A$和$B$的值必定是某两个$x$值。
那么我们就把,$y$的正负分成两个序列,$val1_i$表示$A$取序列中第$i$个数的值是,给的代价,$val2_i$同理。
那么最终的答案情况就是一个$i$一个$j$,分别是$val1_i + val2_j + a_i.x^2 + b_j.x^2 - 2*a_i.x\times b_j.x$。
显然可以斜率优化。
把第一个数列里的所有数抽象成点,为$(-2*a_i.x , val1_i + a_i.x^2)$。
弄一个下凸包,$B$递增枚举然后在凸包上切就好了。
但是,由于我们有一步排序,所以复杂度是$O(nlogn)$。
代码:
#include<bits/stdc++.h>
#define N 500010
using namespace std;
typedef long long ll;
ll bfr[N], aft[N], g[N], f[N], ans = 1e18;
int n, head, tail, m, x[N], y[N], id[N], p[N], q[N], b[N];
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0, f = 1;
char c = nc();
while (c < 48) {
if (c == '-')
f = -1;
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
}
inline double slove(int i, int j) {
return 1.0 * (g[i] - g[j]) / (p[i] - p[j]);
}
inline ll sqr(int x) {
return 1ll * x * x;
}
int main() {
n = rd();
for (int i = 1; i <= n; i ++ )
b[i] = x[i] = rd(), y[i] = rd();
sort(b + 1, b + n + 1);
m = unique(b + 1, b + n + 1) - b - 1;
p[1] = b[1] - 1;
p[m + 2] = b[m] + 1;
for (int i = 1; i <= m; i ++ )
p[i + 1] = b[i];
for (int i = 1, k; i <= n; i ++ ) {
k = lower_bound(b + 1, b + m + 1, x[i]) -b;
bfr[k + 1] += max(-y[i], 0);
aft[k + 1] += max(y[i], 0);
}
n = m + 2;
for (int i = 1; i <= n; i ++ )
bfr[i] += bfr[i - 1];
for (int i = n; i; i -- )
aft[i] += aft[i + 1];
for (int i = 1; i <= n; i ++ )
g[i] = bfr[i - 1] + sqr(p[i]);
head = 1, tail = 0;
for (int i = 1; i <= n; i ++ ) {
while (head < tail && slove(q[tail - 1], q[tail]) >= slove(q[tail - 1], i))
tail -- ;
q[ ++ tail] = i;
while (head < tail && slove(q[head], q[head + 1]) <= 2 * p[i])
head ++ ;
f[i] = sqr(p[i] - p[q[head]]) + bfr[q[head] - 1] + aft[i + 1];
ans = min(ans, f[i]);
}
cout << ans << endl ;
return 0;
}
小结:形式比较明显,斜率优化非常显然。还是要学一下决策单调性才行.....
[Comet OJ - Contest #7 D][52D 2417]机器学习题_斜率优化dp的更多相关文章
- Comet OJ - Contest #6 D. 另一道树题 并查集 + 思维 + 计数
Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...
- Comet OJ - Contest #2 简要题解
Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...
- Comet OJ - Contest #2简要题解
Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...
- Comet OJ - Contest #4--前缀和
原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...
- Comet OJ - Contest #11 题解&赛后总结
Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...
- Comet OJ - Contest #8
Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...
- Comet OJ - Contest #13-C2
Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...
- Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」
来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...
- Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)
来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...
随机推荐
- Verilog求余
在实现三角函数时,考虑到函数的周期性,综量(自变量)需对周期做求余运算. 假设函数周期为T = 2^N,那么求余运算就是直接取该数的低N位,即: 以M位正数为例(符号位为0),reg [M-1:0] ...
- contents() 查找匹配元素内部所有的子节点(包括文本节点)。如果元素是一个iframe,则查找文档内容
contents() V1.2概述 查找匹配元素内部所有的子节点(包括文本节点).如果元素是一个iframe,则查找文档内容 示例 描述:大理石平台检定规程 查找所有文本节点并加粗 HTML 代码 ...
- TTTTTTTTTTTTTTTTT Gym 100851J Jump 构造
题意:首先你输入一个数字n(偶数)(n<=1000),电脑则自动生成一个长度为n的01字符串,你每次可以构造出一个长度为n的01字符串,输入给电脑后电脑进行判定,如果你的字符串与电脑的字符串完全 ...
- [NOI2017]蚯蚓排队
嘟嘟嘟 现在看来这道题还不是特别难. 别一看到字符串就想SAM 看到\(k\)很小,所以我们可以搞一个单次修改复杂度跟\(k\)有关的算法. 能想到,每一次断开或链接,最多只会影响\(k ^ 2\)个 ...
- 【luoguP2483】k短路([SDOI2010]魔法猪学院)
题目描述 iPig在假期来到了传说中的魔法猪学院,开始为期两个月的魔法猪训练.经过了一周理论知识和一周基本魔法的学习之后,iPig对猪世界的世界本原有了很多的了解:众所周知,世界是由元素构成的:元素与 ...
- html页面之间相互传值
常见的在页面登录过后会获得一个token值然后页面跳转时传给下一个页面 sessionStorage.setItem("token",result.token);//传输token ...
- mybatis 多级级联(多级嵌套)
注:笔者这里的嵌套可以用词有点欠缺,忘见谅 需求:用一个查询接口查出其结果集,这里就用伪代码标识要返回前端的类与类之间的关系. class 顶层{ String otherValue; LinkedL ...
- HDU 4496 D-City —— (并查集的应用)
给出n个点和m条边,一条一条地删除边,问每次删除以后有多少个联通块. 分析:其实就是并查集的应用,只是前一阵子一直做图论思路一直囿于tarjan了..方法就是,记录每一条边,然后从最后一条边开始不断的 ...
- CF860E Arkady and a Nobody-men
CF860E Arkady and a Nobody-men 类比LNOI2014 LCA那个题,其实树剖可以过....(用树状数组区间加区间求和更快!) 巧妙的nlogn做法是: blog~ (其实 ...
- MySQL字段命名不能使用的MySQL关键字
#今天遇到一个问题,把某一字段重新命名为condition时报错,于是联想到可能是MySQL的关键字,用``引起来后,问题解决. #在MySQL数据库中,Table字段不能使用MySQL关键字: #[ ...