题目传送门(内部题150)


输入格式

  第一行两个整数$N,Q$。
  接下来的$N$行,每行两个整数$a_i,b_i$。
  接下来的$Q$行,每行一个整数$x$。


输出格式

  对于每个询问,输出一行一个整数表示答案。


样例

样例输入:

2 4
3 0
4 -2
-1
0
1
2

样例输出:

6
0
3
12


数据范围与提示

  每个测试点$10$分,共$10$个测试点:

对于所有的数据,有:$1\leqslant N,Q,|a_i|,|b_i|,|x|<32323$。


题解

发现式子中没有$c_i$,所以可以把一个$x$提出来,于是就变成了一个一次函数,而对于$x$的正负分类讨论就好了。

对于一次函数,可以用单调栈维护凸包找位于凸包上的$a_i,b_i$,然后对于每一组询问二分答案即可。

时间复杂度:$\Theta((N+Q)\log N)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int a,b;}e[500001],S[500001],L[500001],R[500001];
int N,Q;
int top,l,r;
bool cmp1(rec a,rec b){return a.a==b.a?a.b<b.b:a.a<b.a;}
bool cmp2(rec a,rec b){return a.a==b.a?a.b>b.b:a.a<b.a;}
double ask(rec a,rec b){return(double)(a.b-b.b)/(b.a-a.a);}
int main()
{
scanf("%d%d",&N,&Q);
for(int i=1;i<=N;i++)scanf("%d%d",&e[i].a,&e[i].b);
sort(e+1,e+N+1,cmp1);
S[0].a=0x3f3f3f3f;
for(int i=1;i<=N;i++)
{
while(top&&(S[top].a==e[i].a||ask(S[top],e[i])<0))top--;
while(top>1&&ask(S[top-1],S[top])>ask(S[top],e[i]))top--;
S[++top]=e[i];
}
for(int i=1;i<=top;i++)L[++l]=S[i];
sort(e+1,e+N+1,cmp2);top=0;
for(int i=1;i<=N;i++)
{
while(top&&(S[top].a==e[i].a||ask(S[top],e[i])>0))top--;
while(top>1&&ask(S[top-1],S[top])<ask(S[top],e[i]))top--;
S[++top]=e[i];
}
for(int i=1;i<=top;i++)R[++r]=S[i];
while(Q--)
{
int x;scanf("%d",&x);
if(!x){puts("0");continue;}
if(x>0)
{
int lft=1,rht=l,res=1;
while(lft<=rht)
{
int mid=(lft+rht)>>1;
if(ask(L[mid-1],L[mid])<x){lft=mid+1;res=mid;}
else rht=mid-1;
}
printf("%lld\n",1LL*L[res].a*x*x+L[res].b*x);
}
else
{
int lft=1,rht=r,res=1;
while(lft<=rht)
{
int mid=(lft+rht)>>1;
if(ask(R[mid-1],R[mid])<x)rht=mid-1;
else{lft=mid+1;res=mid;}
}
printf("%lld\n",1LL*R[res].a*x*x+R[res].b*x);
}
}
return 0;
}

rp++

[CSP-S模拟测试]:A(单调栈维护凸包+二分答案)的更多相关文章

  1. 【bzoj5089】最大连续子段和 分块+单调栈维护凸包

    题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...

  2. Lost My Music:倍增实现可持久化单调栈维护凸包

    题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值. 那么就是(ci-cj)/(di-dj)的最大值了. 对于每一个点,它的(ci,di)都是二维坐标系里的一个点 要求的就是祖先 ...

  3. HDU 5033 (单调栈维护凸包) Building

    题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...

  4. HDU 5033 Building(单调栈维护凸包)

    盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...

  5. [CSP-S模拟测试]:毛三琛(随机化+二分答案)

    题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...

  6. CF535E Tavas and Pashmaks 单调栈、凸包

    传送门 题意:有一场比赛,$N$个人参加.每个人有两种参数$a,b$,如果存在正实数$A,B$使得$\frac{A}{a_i} + \frac{B}{b_i}$在$i=x$处取得最大值(可以有多个最大 ...

  7. [CSP-S模拟测试]:导弹袭击(数学+凸包+单调栈)

    题目背景 $Guess$准备向敌军阵地发起进攻了!$Guess$的武器是自动制导导弹.然而在机房是不允许游戏的,所以班长$XZY$对游戏界面进行了降维打击,结果... 题目描述 众所周知,环境因素对导 ...

  8. LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)

    LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...

  9. bzoj1007: [HNOI2008]水平可见直线 单调栈维护凸壳

    在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3 ...

随机推荐

  1. WindowsAPI使用详解——GetVersion|GetVersionEx 获取操作系统版本和名称

      Windows API 中有两个函数可以得到系统版本信息:GetVersion和GetVersionEx.      GetVersion这个函数曾经困扰了很多程序员,其本来设计的是在DWORD返 ...

  2. STM32 USB Virtual COM

    STM32 USB Virtual COM USB转串口的功能实现   这次讲的是如何实现USB转串口功能的实现.首先看看工程的布局吧: 我们主要要介绍的文件的在USB_User这个组文件.从上面的截 ...

  3. .net core默认不支持gb2312

    采集数据时,乱码,之前遇到过这个情况,于是老办法: 果断使用Encoding.GetEncoding(“GB2312”),抛异常.搜了下,是因为.net core默认不支持gb2312 所以,两个办法 ...

  4. npm install 报错踩坑路

    先出现的是超过最大调用栈问题: npm ERR! Maximum call stack size exceeded 百度之后说给npm降级或者升级 降级 : npm install -g npm@5. ...

  5. SQL学习——IN运算符

    IN的作用 IN运算符允许您在WHERE子句中指定多个值. IN运算符是多个OR条件的简写. IN的语法 SELECT column_name(s) FROM table_name WHERE col ...

  6. Java基础加强-内部类及代理

    /*内部类是一个编译时的概念,*/ 常规内部类.静态内部类.局部内部类.匿名内部类 1.常规内部类(常规内部类没有static修饰且定义在外部类类体中) 1.常规内部类中的方法可以直接使用外部类的实例 ...

  7. python 获取导入模块的文件路径

    接触到项目上有人写好的模块进行了导入,想查看模块的具体内容是如何实现的,需要找到模块的源文件. 本博文介绍两种查找模块文件路径方法: 方法一: #!/usr/bin/python # -*- codi ...

  8. easyUi的组合表格

    公司之前的项目是用easyui写的里面还混搭着php...把分支下来,有点蒙.晚上回来恶补一下吧,今天渲染这个表格,我开始自己写假数据,然后用ajax操作再使用 obj.datagrid('loadD ...

  9. json-server

    json-server 一个前端模拟数据的本地化服务器 安装 npm install -g json-server 查看是否安装成功 json-server -v 新建一个文件夹 在文件夹中新建db. ...

  10. Linux的正则练习

    grep和 egrep的正则表达式 1.显示三个用户root.wang的UID和默认shell cat /etc/passwd | grep “^\(root\|wang\)” | tr ‘:’ ‘ ...