[THUPC2019]不等式/[51Nod1598]方程最小值
[THUPC2019]不等式/[51Nod1598]方程最小值
题目大意:
给定\(a_{1\sim n}\)和\(b_{1\sim n}\),令\(f_k(x)=\sum_{i=1}^k|a_ix+b_i|\)。对于所有\(k=1\sim n\),求\(f_k\)在\(\mathbb{R}\)中的最小值。
\(1\le n\le 5\times10^5,|a_i|,|b_i|<10^5\)
思路:
\]
画在数轴上就是在\(-\frac{b_i}{a_i}\)(即零点)的位置有\(|a_i|\)个点。要找到一个位置\(x\),使得\(x\)到所有点的距离之和最小。
根据小学奥数的那套理论,\(x\)就是所有零点的加权中位数。我们可以用一个大根堆、一个小根堆来维护所有的零点,并求出中位数。
考虑函数加上绝对值后,\(a_i\)实际的符号。对于\(-\frac{b_i}{a_i}<x\)的函数来说,\(a_i>0\);反之\(a_i<0\)。因此我们可以在对两个堆中的元素分别维护考虑绝对值后\(a_i,b_i\)之和。即可求出最终\(f_k(x)\)的最小值。
时间复杂度\(\mathcal O(n\log n)\)。
源代码:
#include<queue>
#include<cstdio>
#include<cctype>
#include<cassert>
#include<algorithm>
inline int getint() {
register char ch;
register bool neg=false;
while(!isdigit(ch=getchar())) neg|=ch=='-';
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return neg?-x:x;
}
const int N=5e5+1;
using int64=long long;
using Node=std::pair<double,int>;
std::priority_queue<Node,std::vector<Node>,std::greater<Node>> q1;//small
std::priority_queue<Node,std::vector<Node>,std::less<Node>> q2;//big
int64 s1,s2,a1,a2,b1,b2,a[N],b[N];
double o[N];
int main() {
const int n=getint();
for(register int i=1;i<=n;i++) a[i]=getint();
for(register int i=1;i<=n;i++) b[i]=getint();
for(register int i=1;i<=n;i++) {
if(a[i]!=0) {
o[i]=-1.*b[i]/a[i];
if(s1&&o[i]>q1.top().first) {
q1.push(std::make_pair(o[i],i));
if(a[i]>0) a[i]=-a[i],b[i]=-b[i];
a1+=a[i]; b1+=b[i];
s1+=std::abs(a[i]);
} else {
q2.push(std::make_pair(o[i],i));
if(a[i]<0) a[i]=-a[i],b[i]=-b[i];
a2+=a[i]; b2+=b[i];
s2+=std::abs(a[i]);
}
} else {
b1+=std::abs(b[i]);
}
while(s1>s2) {
q2.push(q1.top());
const int i=q1.top().second;
a1-=a[i]; b1-=b[i];
s1-=std::abs(a[i]);
a[i]=-a[i]; b[i]=-b[i];
a2+=a[i]; b2+=b[i];
s2+=std::abs(a[i]);
q1.pop();
}
while(s2>s1) {
q1.push(q2.top());
const int i=q2.top().second;
a2-=a[i]; b2-=b[i];
s2-=std::abs(a[i]);
a[i]=-a[i]; b[i]=-b[i];
a1+=a[i]; b1+=b[i];
s1+=std::abs(a[i]);
q2.pop();
}
const double x=s1?q1.top().first:0;
printf("%.7f\n",a1*x+b1+a2*x+b2);
}
return 0;
}
[THUPC2019]不等式/[51Nod1598]方程最小值的更多相关文章
- C语言作业3
一.实验目的与要求 1.用for语句实现循环 (1)求数列前n项和 掌握for语句实现循环的方法 (2)求数列前n项和 掌握for语句实现循环的方法 循环嵌套的使用 2.用while循环语句实现循环 ...
- HDU 6070 Dirt Ratio(分数规划+线段树)
http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 找出一个区间,使得(区间内不同数的个数/区间长度)的值最小,并输出该值. 思路: 因为是要求$\f ...
- 深入理解SVM,软间隔与对偶问题
今天是机器学习专题的第33篇文章,我们继续来聊聊SVM模型. 在上一篇文章当中我们推到了SVM模型在线性可分的问题中的公式推导,我们最后得到的结论是一个带有不等式的二次项: \[\left\{\beg ...
- dp优化-四边形不等式(模板题:合并石子)
学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...
- 【转】斜率优化DP和四边形不等式优化DP整理
(自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...
- 省选算法学习-dp优化-四边形不等式
嗯......四边形不等式的确长得像个四边形[雾] 我们在dp中,经常见到这样一类状态以及转移方程: 设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\ ...
- HDU3480 Division——四边形不等式或斜率优化
题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小. 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1) ...
- [学习笔记]四边形不等式优化DP
形如$f[i][j]=min{f[i][k]+f[k+1][j]}+w[i][j]$的方程中, $w[\;][\;]$如果同时满足: ①四边形不等式:$w[a][c]+w[b][d]\;\leq\;w ...
- [家里蹲大学数学杂志]第033期稳态可压Navier-Stokes方程弱解的存在性
1. 方程 考虑 $\bbR^3$ 中有界区域 $\Omega$ 上如下的稳态流动: $$\bee\label{eq} \left\{\ba{ll} \Div(\varrho\bbu)=0,\\ \ ...
随机推荐
- [动图演示]Redis 持久化 RDB/AOF 详解与实践【华为云技术分享】
Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...
- 使用Nginx的X-Accel-Redirect实现大文件下载
在实现文件下载功能时通常有以下几种方式: 1.直接给出下载地址,例如http://****.com/test/test.rar,这种是最直接的方式,任何人都可以下载,无法控制用户的权限. 2.验证权限 ...
- ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi
写在前面 最近在做一个app的时候发现需要写后台服务.所以,在考虑是使用webapi还是使用webserver来写这个后台服务的时候.爱纠结的我,最后还是选择了使用webapi来写这个后台服务. 原因 ...
- Java操作JSON数据(1)--JSON-lib操作JSON数据
JSON-lib是一个java库,用于将bean.映射.集合.java数组和XML转换为JSON,或将JSON转为beans和DynaBeans.JSON-lib最后的版本是2.4,更新时间是2010 ...
- 小知识:讲述Linux命令别名与资源文件的区别
别名 别名是命令的快捷方式.为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用.语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令.重要的 ...
- 【转载】C#中Convert.ToDouble方法将字符串转换为double类型
在C#编程过程中,可以使用Convert.ToDouble方法将字符串或者其他可转换为数字的对象变量转换为double类型,Convert.ToDouble方法有多个重载方法,最常使用的一个方法将字符 ...
- BFC特性及其简单应用
BFC是什么? BFC(Block Formatting Context)中文直译就是‘块级格式上下文’,它是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元 ...
- idea安装与注册码破解
idea安装与注册码破解 https://www.cnblogs.com/jajian/p/7989032.html
- restfulframework引用多对多外键
记录一下工作中遇到的问题 最近在写restfulframework,感觉还是很便利的 首先贴一下文档地址 https://www.django-rest-framework.org/api-guide ...
- 关于sql注入盲注,谈谈自己的心得
1.没做防御的站点,拿上sqlmap直接怼就行了. 2.做了防御,有的用函数过滤了,有的用了waf(比如安全狗,云锁,华为云waf,360waf,知道创宇盾,护卫神等等) 这些就相当麻烦了,首先要探测 ...