机器学习题

题目大意

数据范围


题解

学长说是决策单调性?

直接斜率优化就好了嘛

首先发现的是,$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的更多相关文章

  1. Comet OJ - Contest #6 D. 另一道树题 并查集 + 思维 + 计数

    Code: #include <cstdio> #include <algorithm> #include <cstring> #include <vecto ...

  2. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  3. Comet OJ - Contest #2简要题解

    Comet OJ - Contest #2简要题解 前言: 我没有小裙子,我太菜了. A 因自过去而至的残响起舞 https://www.cometoj.com/contest/37/problem/ ...

  4. Comet OJ - Contest #4--前缀和

    原题:Comet OJ - Contest #4-B https://www.cometoj.com/contest/39/problem/B?problem_id=1577传送门 一开始就想着暴力打 ...

  5. Comet OJ - Contest #11 题解&赛后总结

    Solution of Comet OJ - Contest #11 A.eon -Problem designed by Starria- 在模 10 意义下,答案变为最大数的最低位(即原数数位的最 ...

  6. Comet OJ - Contest #8

    Comet OJ - Contest #8 传送门 A.杀手皇后 签到. Code #include <bits/stdc++.h> using namespace std; typede ...

  7. Comet OJ - Contest #13-C2

    Comet OJ - Contest #13-C2 C2-佛御石之钵 -不碎的意志-」(困难版) 又是一道并查集.最近做过的并查集的题貌似蛮多的. 思路 首先考虑,每次处理矩形只考虑从0变成1的点.这 ...

  8. Comet OJ - Contest #13 「火鼠的皮衣 -不焦躁的内心-」

    来源:Comet OJ - Contest #13 芝士相关: 复平面在信息学奥赛中的应用[雾 其实是道 sb 题??? 发现原式貌似十分可二项式定理,然后发现确实如此 我们把 \(a^i\) 替换成 ...

  9. Comet OJ - Contest #13 「佛御石之钵 -不碎的意志-」(hard)

    来源:Comet OJ - Contest #13 一眼并查集,然后发现这题 tmd 要卡常数的说卧槽... 发现这里又要用并查集跳过访问点,又要用并查集维护联通块,于是开俩并查集分别维护就好了 一开 ...

随机推荐

  1. msyql round函数隐藏问题

    1.背景 在用mysql round进行四舍五入计算的时候如果参与计算的字段为float,则最终计算出的四舍五入效果会有很大出入.例子我就不列举了 2.原因 mysql官方文档中关于ROUND函数的部 ...

  2. HFUUOJ1024 动态开点线段树+标记永久化

    题意 分析 动态加点线段树,标记永久化好写常数小 Code #include<bits/stdc++.h> #define fi first #define se second #defi ...

  3. node中fs内置模块

    Node.js内置的fs模块就是文件系统模块,负责读写文件. 和所有其它JavaScript模块不同的是,fs模块同时提供了异步和同步的方法. 回顾一下什么是异步方法.因为JavaScript的单线程 ...

  4. Jenkins忘记admin密码补救措施

    遇到将Jenkins登录名密码忘记的情况,下面的方式可以重置密码. 进入C:\Program Files (x86)\Jenkins\users 目录可以看到admin开头的文件夹,里面有个confi ...

  5. c 判断是否为非控制字符

    #include <stdio.h> #include <wctype.h> int main () { ; wchar_t str[] = L"first line ...

  6. Pytest学习笔记(一) 环境安装及入门

    简介 pytest是python的一个单元测试框架,类似于unittest,相对unittest来说,pytest使用更简单,功能更强大. 安装 pip3 install -U pytest 查看版本 ...

  7. 深入解析 composer 的自动加载原理

    PHP 自5.3的版本之后,已经重焕新生,命名空间.性状(trait).闭包.接口.PSR 规范.以及 composer 的出现已经让 PHP 变成了一门现代化的脚本语言.PHP 的生态系统也一直在演 ...

  8. CodeIgniter启用缓存和清除缓存的方法

    Codeigniter支持缓存技术,以达到最快的速度.尽管CI已经相当高效了,但是网页中的动态内容.主机的内存CPU和数据库读取速度等因素直接影响了网页的加载速度.依靠网页缓存,你的网页可以达到近乎静 ...

  9. Mac下持续集成-Mac下Tomcat+Jenkins集成环境搭建

    一.MAC安装jdk及环境变量配置 1)访问Oracle官网 http://www.oracle.com,浏览到首页的底部菜单 ,然后按下图提示操作: 2)下载完成后点击安装包,按提示即可完成安装. ...

  10. golang 故障模拟工具failpoint的使用

    测试是功能上线之前的重要环节. 测试过程中,要尽量覆盖各种场景.故障情况或异常情况下的场景测试,也是必不可少的. 如何模拟故障呢? 在FreeBSD 中, failpoints经常用来模拟故障. 在g ...