题意

给出N 个形如$f_i(x) = a_i x^2 + b_i x $的二次函数。

有Q 次询问,每次给出一个x,询问$max{\{f_i(x)\}}$。$N,Q \leq 5*10^5$。


思考

首先将x大于0还是小于0分类,对于某一类全都除以x,那么就得到了一些直线。最优的答案一定在某条最上方或最下方的直线上,半平面交或凸包即可。


代码

 // luogu-judger-enable-o2
#pragma GCC optimize 2
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
typedef long double ld;
const int maxn=5E5+;
const int base=;
const ld eps=1E-;
const ld inf=1E17;
int n,m,T;
ll a[maxn],b[maxn],ans[maxn];
int idR[maxn],idL[maxn];
ld rightPlane[maxn],leftPlane[maxn];
int q[maxn];
struct pt
{
double x,y;
pt(double a=,double b=):x(a),y(b){}
pt operator+(const pt&A){return pt(x+A.x,y+A.y);}
pt operator-(const pt&A){return pt(x-A.x,y-A.y);}
pt operator*(ld d){return pt(x*d,y*d);}
double operator*(const pt&A){return x*A.y-y*A.x;}
void out(){cout<<"("<<x<<","<<y<<")"<<endl;}
};
struct line
{
pt A,B;
int id,b;
int slope;
line(){}
line(pt a,pt b):A(a),B(b){}
}s[maxn];
inline ll max(ll x,ll y)
{
return x>y?x:y;
}
inline ll min(ll x,ll y)
{
return x<y?x:y;
}
inline ll get(ll x,ll a,ll b)
{
return (a*x+b)*x;
}
inline int read()
{
bool flag=;
char ch=getchar();
if(ch=='-')
flag^=;
while(!isdigit(ch))
{
ch=getchar();
if(ch=='-')
flag^=;
}
int sum=ch-'';
ch=getchar();
while(isdigit(ch))
{
sum=sum*+ch-'';
ch=getchar();
}
return flag?-sum:sum;
}
void write(ll x)
{
if(x>=)
write(x/);
putchar(''+x%);
}
inline void writen(ll x)
{
if(x<)
{
putchar('-');
write(-x);
}
else
write(x);
putchar('\n');
}
inline int cross(pt A,pt B)
{
ld d=A*B;
if(abs(d)<=eps)
return ;
return d>?:-;
}
inline pt intersection(line a,line b)
{
pt A=b.B-b.A,B=a.B-a.A,C=b.A-a.A;
if(cross(A,B)==)
return pt(inf,inf);
ld d=-(B*C)/(B*A);
return b.A+A*d;
}
inline int onClockwise(line a,line b,line c)
{
return cross(a.B-a.A,intersection(b,c)-a.A)==-;
}
bool cmpR(line A,line B)
{
if(A.slope==B.slope)
return A.b<B.b;
return A.slope<B.slope;
}
bool cmpL(line A,line B)
{
if(A.slope==B.slope)
return A.b>B.b;
return A.slope<B.slope;
}
void initR()
{
sort(s+,s+n+,cmpR);
int L=,R=;
for(int i=;i<=n;++i)
{
while(i!=n&&s[i].slope==s[i+].slope)
++i;
while(R->=L&&onClockwise(s[i],s[q[R]],s[q[R-]]))
--R;
q[++R]=i;
}
for(int i=;i<=R;++i)
idR[i]=s[q[i]].id;
for(int i=;i<R;++i)
rightPlane[i]=intersection(s[q[i]],s[q[i+]]).x;
int pos=;
for(int i=-base;i<=base;++i)
{
while(pos<R&&rightPlane[pos]<ld(i))
++pos;
ans[i+base]=get(i,s[q[pos]].slope,s[q[pos]].b);
}
}
void initL()
{
sort(s+,s+n+,cmpL);
int L=,R=;
for(int i=;i<=n;++i)
{
while(i!=n&&s[i].slope==s[i+].slope)
++i;
while(R->=L&&onClockwise(s[i],s[q[R]],s[q[R-]]))
--R;
q[++R]=i;
}
for(int i=;i<=R;++i)
idL[i]=s[q[i]].id;
for(int i=;i<R;++i)
leftPlane[i]=intersection(s[q[i]],s[q[i+]]).x;
int pos=;
for(int i=base;i>=-base;--i)
{
while(pos<R&&ld(i)<leftPlane[pos])
++pos;
ans[i+base]=max(ans[i+base],get(i,s[q[pos]].slope,s[q[pos]].b));
}
}
int main()
{
// freopen("A.in","r",stdin);
// freopen("A.out","w",stdout);
ios::sync_with_stdio(false);
n=read(),T=read();
for(int i=;i<=n;++i)
{
a[i]=read(),b[i]=read();
s[i].A=pt(,b[i]);
s[i].B=pt(,a[i]+b[i]);
s[i].slope=a[i];
s[i].b=b[i];
s[i].id=i;
}
initR();
for(int i=;i<=n;++i)
swap(s[i].A,s[i].B);
initL();
while(T--)
{
int x=read();
writen(ans[x+base]);
}
return ;
}

[校内训练19_09_02]A的更多相关文章

  1. [校内训练19_09_02]C

    题意 给出一棵N 个节点的树,树上的每个节点都有一个权值$a_i$. 有Q 次询问,每次在树上选中两个点u, v,考虑所有在简单路径u, v 上(包括u, v)的点构成的集合S. 求$\sum_{w∈ ...

  2. [4.14校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi....        很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...

  3. [2017.4.7校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...

  4. [3.24校内训练赛by hzwer]

    来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...

  5. 19_04_19校内训练[Game]

    题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...

  6. 19_04_02校内训练[deadline]

    题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...

  7. 平面图转对偶图&19_03_21校内训练 [Everfeel]

    对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...

  8. fzyzojP3979 -- [校内训练20180914]魔法方阵

    原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...

  9. fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试

    题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...

随机推荐

  1. codeforces 1183F 离散化枚举 约数定理

    codeforces1183F 有技巧的暴力 传送门:https://codeforces.com/contest/1183/problem/F 题意: 给你n个数,要你从中选出最多三个数,使得三个数 ...

  2. linux安装python3.*,更换Python2.*

    下载并解压:Python-3.5.7.tgz [root@AH-aQYWTYSJZX01 python3]# ll total 20268 -rw-r----- 1 temp01 temp01 207 ...

  3. kali机获取不到ip地址解决

    一.方法一 重启网卡:/etc/init.d/networking restart 重启kali:reboot 二.方法二 更改网络适配器:虚拟机-可移动设备-网络适配器设置-选择“桥接模式:直接连接 ...

  4. Selenium3+Python3环境搭建

    安装python 官网直接下载当前最新版的python Python官网地址:https://www.python.org/ 百度搜索Python3.6安装步骤 Python安装步骤:自行百度,暂不提 ...

  5. 0019 盒子模型(CSS重点):边框、内外边距、布局稳定性、PS

    typora-copy-images-to: media 第01阶段.前端基础.盒子模型 盒子模型(CSS重点) css学习三大重点: css 盒子模型 . 浮动 . 定位 主题思路: 目标: 理解: ...

  6. poj1737-----这题有毒

    这题有毒,不取模还会溢出,我哭了 <进阶指南>p337动态规划 公式就是个这了,代码就不贴了,反正是错的,用java算了

  7. iptables详细参数讲解

    table 表 --> chain 链 --->rule 规则Commands:Either long or short options are allowed. --append -A ...

  8. java数据结构之常用排序算法

    冒泡排序 private void maopao(int arr[]) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j &l ...

  9. nginx配置项。

      一,用于调试进程,定位问题的配置项. (1)是否以守护进程方式运行nginx语法:daemon on | off:默认是on,daemon是脱离终端并且在后台运行的进程,off是关闭守护进程的模式 ...

  10. Spring Cloud Stream消息驱动@SendTo和消息降级

    参考程序员DD大佬的文章,自己新建demo学习学习,由于需要消息回执,看到了@SendTo这个注解能够实现,下面开始学习demo,新建两个项目cloud-stream-consumer消费端 和 cl ...