[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\)

思路:

\[\sum_{i=1}^k|a_ix+b_i|=\sum_{i=1}^k|a_i||x+\frac{b_i}{a_i}|
\]

画在数轴上就是在\(-\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)\)。

源代码:

  1. #include<queue>
  2. #include<cstdio>
  3. #include<cctype>
  4. #include<cassert>
  5. #include<algorithm>
  6. inline int getint() {
  7. register char ch;
  8. register bool neg=false;
  9. while(!isdigit(ch=getchar())) neg|=ch=='-';
  10. register int x=ch^'0';
  11. while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
  12. return neg?-x:x;
  13. }
  14. const int N=5e5+1;
  15. using int64=long long;
  16. using Node=std::pair<double,int>;
  17. std::priority_queue<Node,std::vector<Node>,std::greater<Node>> q1;//small
  18. std::priority_queue<Node,std::vector<Node>,std::less<Node>> q2;//big
  19. int64 s1,s2,a1,a2,b1,b2,a[N],b[N];
  20. double o[N];
  21. int main() {
  22. const int n=getint();
  23. for(register int i=1;i<=n;i++) a[i]=getint();
  24. for(register int i=1;i<=n;i++) b[i]=getint();
  25. for(register int i=1;i<=n;i++) {
  26. if(a[i]!=0) {
  27. o[i]=-1.*b[i]/a[i];
  28. if(s1&&o[i]>q1.top().first) {
  29. q1.push(std::make_pair(o[i],i));
  30. if(a[i]>0) a[i]=-a[i],b[i]=-b[i];
  31. a1+=a[i]; b1+=b[i];
  32. s1+=std::abs(a[i]);
  33. } else {
  34. q2.push(std::make_pair(o[i],i));
  35. if(a[i]<0) a[i]=-a[i],b[i]=-b[i];
  36. a2+=a[i]; b2+=b[i];
  37. s2+=std::abs(a[i]);
  38. }
  39. } else {
  40. b1+=std::abs(b[i]);
  41. }
  42. while(s1>s2) {
  43. q2.push(q1.top());
  44. const int i=q1.top().second;
  45. a1-=a[i]; b1-=b[i];
  46. s1-=std::abs(a[i]);
  47. a[i]=-a[i]; b[i]=-b[i];
  48. a2+=a[i]; b2+=b[i];
  49. s2+=std::abs(a[i]);
  50. q1.pop();
  51. }
  52. while(s2>s1) {
  53. q1.push(q2.top());
  54. const int i=q2.top().second;
  55. a2-=a[i]; b2-=b[i];
  56. s2-=std::abs(a[i]);
  57. a[i]=-a[i]; b[i]=-b[i];
  58. a1+=a[i]; b1+=b[i];
  59. s1+=std::abs(a[i]);
  60. q2.pop();
  61. }
  62. const double x=s1?q1.top().first:0;
  63. printf("%.7f\n",a1*x+b1+a2*x+b2);
  64. }
  65. return 0;
  66. }

[THUPC2019]不等式/[51Nod1598]方程最小值的更多相关文章

  1. C语言作业3

    一.实验目的与要求 1.用for语句实现循环 (1)求数列前n项和 掌握for语句实现循环的方法 (2)求数列前n项和 掌握for语句实现循环的方法 循环嵌套的使用 2.用while循环语句实现循环 ...

  2. HDU 6070 Dirt Ratio(分数规划+线段树)

    http://acm.hdu.edu.cn/showproblem.php?pid=6070 题意: 找出一个区间,使得(区间内不同数的个数/区间长度)的值最小,并输出该值. 思路: 因为是要求$\f ...

  3. 深入理解SVM,软间隔与对偶问题

    今天是机器学习专题的第33篇文章,我们继续来聊聊SVM模型. 在上一篇文章当中我们推到了SVM模型在线性可分的问题中的公式推导,我们最后得到的结论是一个带有不等式的二次项: \[\left\{\beg ...

  4. dp优化-四边形不等式(模板题:合并石子)

    学习博客:https://blog.csdn.net/noiau/article/details/72514812 看了好久,这里整理一下证明 方程形式:dp(i,j)=min(dp(i,k)+dp( ...

  5. 【转】斜率优化DP和四边形不等式优化DP整理

    (自己的理解:首先考虑单调队列,不行时考虑斜率,再不行就考虑不等式什么的东西) 当dp的状态转移方程dp[i]的状态i需要从前面(0~i-1)个状态找出最优子决策做转移时 我们常常需要双重循环 (一重 ...

  6. 省选算法学习-dp优化-四边形不等式

    嗯......四边形不等式的确长得像个四边形[雾] 我们在dp中,经常见到这样一类状态以及转移方程: 设$dp\left[i\right]\left[j\right]$表示闭区间$\left[i,j\ ...

  7. HDU3480 Division——四边形不等式或斜率优化

    题目大意 将N个数分成M部分,使每部分的最大值与最小值平方差的和最小. 思路 首先肯定要将数列排序,每部分一定是取连续的一段,于是就有了方程 $\Large f(i,j)=min(f(i-1,k-1) ...

  8. [学习笔记]四边形不等式优化DP

    形如$f[i][j]=min{f[i][k]+f[k+1][j]}+w[i][j]$的方程中, $w[\;][\;]$如果同时满足: ①四边形不等式:$w[a][c]+w[b][d]\;\leq\;w ...

  9. [家里蹲大学数学杂志]第033期稳态可压Navier-Stokes方程弱解的存在性

    1. 方程  考虑 $\bbR^3$ 中有界区域 $\Omega$ 上如下的稳态流动: $$\bee\label{eq} \left\{\ba{ll} \Div(\varrho\bbu)=0,\\ \ ...

随机推荐

  1. [动图演示]Redis 持久化 RDB/AOF 详解与实践【华为云技术分享】

    Redis 是一个开源( BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件.它支持的数据类型很丰富,如字符串.链表.集 合.以及散列等,并且还支持多种排序功能. 什么叫持 ...

  2. 使用Nginx的X-Accel-Redirect实现大文件下载

    在实现文件下载功能时通常有以下几种方式: 1.直接给出下载地址,例如http://****.com/test/test.rar,这种是最直接的方式,任何人都可以下载,无法控制用户的权限. 2.验证权限 ...

  3. ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi

    写在前面 最近在做一个app的时候发现需要写后台服务.所以,在考虑是使用webapi还是使用webserver来写这个后台服务的时候.爱纠结的我,最后还是选择了使用webapi来写这个后台服务. 原因 ...

  4. Java操作JSON数据(1)--JSON-lib操作JSON数据

    JSON-lib是一个java库,用于将bean.映射.集合.java数组和XML转换为JSON,或将JSON转为beans和DynaBeans.JSON-lib最后的版本是2.4,更新时间是2010 ...

  5. 小知识:讲述Linux命令别名与资源文件的区别

    别名 别名是命令的快捷方式.为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用.语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令.重要的 ...

  6. 【转载】C#中Convert.ToDouble方法将字符串转换为double类型

    在C#编程过程中,可以使用Convert.ToDouble方法将字符串或者其他可转换为数字的对象变量转换为double类型,Convert.ToDouble方法有多个重载方法,最常使用的一个方法将字符 ...

  7. BFC特性及其简单应用

    BFC是什么? BFC(Block Formatting Context)中文直译就是‘块级格式上下文’,它是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其他元 ...

  8. idea安装与注册码破解

    idea安装与注册码破解 https://www.cnblogs.com/jajian/p/7989032.html

  9. restfulframework引用多对多外键

    记录一下工作中遇到的问题 最近在写restfulframework,感觉还是很便利的 首先贴一下文档地址 https://www.django-rest-framework.org/api-guide ...

  10. 关于sql注入盲注,谈谈自己的心得

    1.没做防御的站点,拿上sqlmap直接怼就行了. 2.做了防御,有的用函数过滤了,有的用了waf(比如安全狗,云锁,华为云waf,360waf,知道创宇盾,护卫神等等) 这些就相当麻烦了,首先要探测 ...