[CSP-S模拟测试]:A(单调栈维护凸包+二分答案)
题目传送门(内部题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(单调栈维护凸包+二分答案)的更多相关文章
- 【bzoj5089】最大连续子段和 分块+单调栈维护凸包
题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A l r x :将 [l,r] 区间内的所有数加上 x : Q l r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...
- Lost My Music:倍增实现可持久化单调栈维护凸包
题目就是求树上每个节点的所有祖先中(ci-cj)/(dj-di)的最小值. 那么就是(ci-cj)/(di-dj)的最大值了. 对于每一个点,它的(ci,di)都是二维坐标系里的一个点 要求的就是祖先 ...
- HDU 5033 (单调栈维护凸包) Building
题意: 一个人在x轴上,他的左右两侧都有高楼,给出楼的横坐标Xi和高度Hi还有人的位置pos,求人所能看到的天空的最大角度. 分析: 将建筑物和人的位置从左到右排序,对于每个位置利用栈求一次人左边建筑 ...
- HDU 5033 Building(单调栈维护凸包)
盗张图:来自http://blog.csdn.net/xuechelingxiao/article/details/39494433 题目大意:有一排建筑物坐落在一条直线上,每个建筑物都有一定的高度, ...
- [CSP-S模拟测试]:毛三琛(随机化+二分答案)
题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...
- CF535E Tavas and Pashmaks 单调栈、凸包
传送门 题意:有一场比赛,$N$个人参加.每个人有两种参数$a,b$,如果存在正实数$A,B$使得$\frac{A}{a_i} + \frac{B}{b_i}$在$i=x$处取得最大值(可以有多个最大 ...
- [CSP-S模拟测试]:导弹袭击(数学+凸包+单调栈)
题目背景 $Guess$准备向敌军阵地发起进攻了!$Guess$的武器是自动制导导弹.然而在机房是不允许游戏的,所以班长$XZY$对游戏界面进行了降维打击,结果... 题目描述 众所周知,环境因素对导 ...
- LOJ #2769 -「ROI 2017 Day 1」前往大都会(单调栈维护斜率优化)
LOJ 题面传送门 orz 斜率优化-- 模拟赛时被这题送走了,所以来写篇题解( 首先这个最短路的求法是 trivial 的,直接一遍 dijkstra 即可( 重点在于怎样求第二问.注意到这个第二问 ...
- bzoj1007: [HNOI2008]水平可见直线 单调栈维护凸壳
在xoy直角坐标平面上有n条直线L1,L2,...Ln,若在y值为正无穷大处往下看,能见到Li的某个子线段,则称Li为可见的,否则Li为被覆盖的.例如,对于直线:L1:y=x; L2:y=-x; L3 ...
随机推荐
- DateTime.TryParse 日期时间字符串验证
DateTime applicationDatetime = new DateTime(); bool applicationDate = DateTime.TryParse("2019-0 ...
- 怎样理解JS的预解析机制
JS的预解析包括两部分: 1. 变量提升 2. 函数声明 对于变量提升, 可以看下下面这块代码 console.log(name); // undefined var name = "Lil ...
- spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目
spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09
- 01 Java 内存分配全面浅析
http://blog.csdn.net/shimiso/article/details/8595564 Java 内存分配全面浅析 本文将由浅入深详细介绍Java内存分配的原理,以帮助新手更轻松的 ...
- DDD 理解
DDD提倡充血模型,业务放在类中,而不是服务中,刚开始是比较不清楚的.突然明白,以前开发桌面程序的时候,不就是这样处理了吗?业务分析和代码实现一一对应.因为桌面程序没有数据库,他就是纯粹的面向对象的实 ...
- 安卓开发之利用XmlPullParser解析XML文件
package com.lidaochen.phonecall; import android.support.v7.app.AppCompatActivity; import android.os. ...
- win 10 睡眠无法唤醒
近日遇到win10系统睡眠后无法唤醒的问题,于是网上到处搜索解决办法,试了其中几个比如回退 Intel(R) Management Engine Interface 的版本.设置电源的睡眠选项以利用休 ...
- 7.JSP技术
JSP和Servlet一样,都是用于开发动态web资源的技术 JSP的两个特性:1.写JSP代码就像是在写HTML代码,但JSP技术允许在页面中编写java代码(理解为一种特殊的HTML) 2.JSP ...
- 03_Redis_String命令
一:Redis命令---String命令:Redis 字符串数据类型的相关命令用于管理 redis 字符串值 字符串类型是Redis中最为基础.常用的数据存储类型,字符串在Redis中是二进制安全的, ...
- sysbench 数据库性能测试工具的使用
sysbench 数据库性能测试 Mac上安装sysbench测试工具 brew install sysbench 测试sysbench 是否安装成功 //执行这条指令 sysbench cpu -- ...