[校内训练19_09_02]A
题意
给出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的更多相关文章
- [校内训练19_09_02]C
题意 给出一棵N 个节点的树,树上的每个节点都有一个权值$a_i$. 有Q 次询问,每次在树上选中两个点u, v,考虑所有在简单路径u, v 上(包括u, v)的点构成的集合S. 求$\sum_{w∈ ...
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- [3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 19_04_19校内训练[Game]
题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...
- 19_04_02校内训练[deadline]
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...
- 平面图转对偶图&19_03_21校内训练 [Everfeel]
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...
- fzyzojP3979 -- [校内训练20180914]魔法方阵
原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...
- fzyzojP3580 -- [校内训练-互测20180315]小基的高智商测试
题目还有一个条件是,x>y的y只会出现一次(每个数直接大于它的只有一个) n<=5000 是[HNOI2015]实验比较 的加强版 g(i,j,k)其实可以递推:g(i,j,k)=g(i- ...
随机推荐
- CString::CompareNoCase与CString::Compare的区别
转载:https://blog.csdn.net/lingdxuyan/article/details/4362116 函数原型:int CompareNoCase( LPCTSTR lpsz ) c ...
- vim 方式快捷编辑代码
说明 **I: ** 行首插入 **a: ** 追加 **A: ** 行尾插入 **R: ** 替换文字 **v: ** 选择 **ctrl-v: ** 选择举行区域 **x: ** 删除 **dd: ...
- OPEN GL
https://blog.csdn.net/cdut100/article/details/45753227 https://www.jianshu.com/p/d22cf555de47 https: ...
- Spring注解之@Autowired、@Qualifier、@Resource、@Value
前言 @Autowired.@Qualifier.@Resource.@Value四个注解都是用于注入数据的,他们的作用就和在xml配置文件中的bean标签中写一个标签的作用是一样的!本篇中特别要讲解 ...
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
- 0010 CSS字体样式属性:font-size、font-family、Unicode字体、font-weight、font-style、综合设置、color、 text-align、line-height、text-indent、text-decoration、、、
CSS字体样式属性.调试工具 目标 应用 使用css字体样式完成对字体的设置 使用css外观属性给页面元素添加样式 使用常用的emment语法 能够使用开发人员工具代码调试 1.font字体 1.1 ...
- XAMPP下MYSQL中文乱码问题的解决
XAMPP下MYSQL中文乱码问题的解决 现象描述: 安装完成XAMMP后,内置有MySQL数据库. 新建好自己的数据库后通过hibernate往表里面添加一些中文信息时全部乱码变成“??”. 问题解 ...
- [白话解析] 深入浅出一致性Hash原理
[白话解析] 深入浅出一致性Hash原理 0x00 摘要 一致性哈希算法是分布式系统中常用的算法.但相信很多朋友都是知其然而不知其所以然.本文将尽量使用易懂的方式介绍一致性哈希原理,并且通过具体应用场 ...
- key_load_public: invalid format
ssh-keygen -f ~/.ssh/id_rsa -y > ~/.ssh/id_rsa.pub
- 动态规划之抢劫问题-LT213
找到大问题和小问题之间共有的特性,列出一定的状态转移规律,然后设计满足条件的小问题解决方案,最后凭借记忆中的中间值快速求出最终解 动态规划问题的复杂性在于你永远不知道下一个题目中的状态是什么,有什么样 ...