[校内训练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- ...
随机推荐
- Hbase概念原理扫盲
一.Hbase简介 1.什么是Hbase Hbase的原型是google的BigTable论文,收到了该论文思想的启发,目前作为hadoop的子项目来开发维护,用于支持结构化的数据存储. Hbase是 ...
- Netty小结
前言 在实际开发中,netty的开发使用相对较小,why?在企业中涉及网络编程的部分比重较小,在这大环境内,企业会优先使用简单的http,udp等基础的通讯协议工具,如果不能满足需求,会考虑基于rpc ...
- Java并发机制的底层实现原理之volatile应用,初学者误看!
volatile的介绍: Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现 ...
- 【Docker】初识与应用场景认知
什么是Docker? Docker是一个容器化平台,它以容器的形式将您的应用程序及其所有依赖项打包在一起,以确保您的应用程序在任何环境中无缝运行. 什么是Docker容器? Docker容器包括应用程 ...
- selenium元素和浏览器操作
click和clear from selenium.webdriver.support.wait import WebDriverWait import time browser = webdrive ...
- 洛谷$P4249\ [WC2007]$剪刀石头布 网络流
正解:网络流 解题报告: 传送门$QwQ$ 题目大意其实就说有一个$n$个节点的有向完全图,然后部分边的方向已经给定了,要求确定所有边的方向使三元环数目有$max$.这里三元环的定义是说三条边的方向一 ...
- 洛谷$P$3066 逃跑的$BarnRunning\ Away\ From…$ $[USACO12DEC]$ 主席树
正解:主席树 解题报告: 传送门! 1551做$dp$实在是做不下去了,,,于是来水点儿别的题$QAQ$ 然后这题,挺纸老虎的我$jio$得,,,看起来很难的样子然后仔细想下之后发现依然是个板子呢,, ...
- Linux学习之路--常用命令讲解
Linux常用命令讲解 1.命令格式:命令 [-选项] [参数] 超级用户的提示符是# 一般用户的提示符是$ 如:ls -la /usr说明: 大部分命令遵从该格式多个选项时,可以一起写 eg:ls ...
- LibreOJ 6277. 数列分块入门 1 题解
题目链接:https://loj.ac/problem/6277 题目描述 给出一个长为 \(n\) 的数列,以及 \(n\) 个操作,操作涉及区间加法,单点查值. 输入格式 第一行输入一个数字 \( ...
- 一次 kafka 消息堆积问题排查
收到某业务组的小伙伴发来的反馈,具体问题如下: 项目中某 kafka 消息组消费特别慢,有时候在 kafka-manager 控制台看到有些消费者已被踢出消费组. 从服务端日志看到如下信息: 该消费组 ...