bzoj2961&&bzoj4140 共点圆
题目描述
在平面直角坐标系中,Wayne需要你完成n次操作,操作只有两种:
1.0 x y。表示在坐标系中加入一个以(x, y)为圆心且过原点的圆。
2.1 x y。表示询问点(x, y)是否在所有已加入的圆的内部(含圆周),且至少在一个圆内部(含圆周)。
为了减少你的工作量,题目保证圆心严格在x轴上方(纵坐标为正),且横坐标非零。
输入格式
第1行一个整数n。
接下来n行,每行第一个数是0或1,分别表示两种操作。
接着有两个实数x和y,具体意义见题面。
输出格式
对于每个询问操作,如果点在所有已加入的圆内(或圆周上),则输出“Yes”(不含引号);否则输出“No”(不含引号)。
数据范围
对于100%的数据,n≤500000,所有坐标绝对值不超过10000。
题解
- 在一个圆内$(x-a)^2 + (y-b)^2 <= x^2 + y^2$,化简得$ax + by >= \frac{a^2 + b^2}{2}$,
- 右边是定值,求出$ax+by$的最小值即可判断,做法类似bzoj3533
- 如果对时间分治,每次对区间左边求凸包,$n \ logn$可以实现;
- bzoj4140要求强制在线,可以采用二进制分组
- 由于只会从后面查询,类似树状数组,每次重构末尾的$lowbit$位的凸包,查询不断-=lowbit(i)三分;
- 注意复杂度的理解:
- 考虑$n$位二进制数$N$,$lowbit$为第$i$位的有,$2^{n-i}$个,
- $\sum_{i=0}^{n-1} 2^i \ * \ 2^{n-i} = N \ log_{2} \ N$
#include<bits/stdc++.h>
#define ld double
#define il inline
using namespace std;
const int N=;
const ld eps=1e-;
int n,m,st1[N],ed1[N],st2[N],ed2[N],top,cnt;
ld mn;
il int dcmp(ld x){return fabs(x)<eps?:x<?-:;}
struct P{
ld x,y;
P(ld X=,ld Y=):x(X),y(Y){};
bool operator <(const P&a)const{return fabs(x-a.x)<eps?y<a.y:x<a.x;}
P operator -(const P&a)const{return P(x-a.x,y-a.y);}
}q[N],p[N],t[N],Q;
ld crs(const P&a,const P&b){return a.x*b.y-a.y*b.x;}
ld dot(const P&a,const P&b){return a.x*b.x+a.y*b.y;}
void ask(int l,int r){
while(r-l>=){
int mid=(r-l)/,mid1=l+mid,mid2=r-mid;
if(dot(q[mid1],Q)>dot(q[mid2],Q))l=mid1;
else r=mid2;
}
for(int i=l;i<=r;++i)mn=min(mn,dot(q[i],Q));
}
int main(){
#ifndef ONLINE_JUDGE
freopen("bzoj2961.in","r",stdin);
freopen("bzoj2961.out","w",stdout);
#endif
scanf("%d",&n);
for(int i=,op;i<=n;++i){
scanf("%d",&op);
if(op==){
m++;scanf("%lf%lf",&p[m].x,&p[m].y);
p[m].x+=cnt,p[m].y+=cnt;
int l=m-(m&-m)+,r=m;
st1[m]=top=l;
for(int j=l;j<=r;++j)t[j]=p[j];
sort(t+l,t+r+);
q[top]=t[l];
for(int j=l+;j<=r;++j){
while(top>l&&dcmp(crs(q[top]-q[top-],t[j]-q[top]))<=)top--;
q[++top]=t[j];
}
int now=ed1[m]=st2[m]=top;
for(int j=r-;j>=l;--j){
while(top>now&&dcmp(crs(q[top]-q[top-],t[j]-q[top]))<=)top--;
if(j>l)q[++top]=t[j];
}
ed2[m]=top;
}else{
scanf("%lf%lf",&Q.x,&Q.y);
Q.x+=cnt,Q.y+=cnt;
if(!m){puts("No");continue;}
mn = 1e18;
for(int j=m;j;j-=j&-j){
if(Q.y>)ask(st1[j],ed1[j]);
else ask(st2[j],ed2[j]),mn=min(mn,dot(Q,q[st1[j]]));
}
if(dcmp(mn*-Q.x*Q.x-Q.y*Q.y)>=)puts("Yes"),cnt++;
else puts("No");
}
}
}
bzoj2961&&4140
bzoj2961&&bzoj4140 共点圆的更多相关文章
- 【BZOJ2961】共点圆(CDQ分治)
[BZOJ2961]共点圆(CDQ分治) 题面 BZOJ 题解 设询问点\((x,y)\),圆心是\((X,Y)\) 那么如果点在园内的话就需要满足 \((X-x)^2+(Y-y)^2\le X^2+ ...
- 【bzoj2961】 共点圆
http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...
- BZOJ4140 : 共点圆加强版
假设当前询问点为$(A,B)$,那么它在一个以$(x,y)$为圆心的圆里需要满足: $(x-A)^2+(y-B)^2\leq x^2+y^2$ $2Ax+2By\geq A^2+B^2$ 等价于询问所 ...
- 【bzoj2961】共点圆 k-d树
更新:此题我的代码设置eps=1e-8会WA,现在改为1e-9貌似T了 此题网上的大部分做法是cdq分治+凸包,然而我觉得太烦了,于是自己口胡了一个k-d树做法: 加入一个圆$(x,y)$,直接在k- ...
- 【BZOJ4140】共点圆加强版(二进制分组)
[BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...
- BZOJ2961: 共点圆
好久没发了 CDQ分治,具体做法见XHR的论文… /************************************************************** Problem: 29 ...
- BZOJ2961 共点圆[CDQ分治]
题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...
- bzoj2961 共点圆 bzoj 4140
题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...
- bzoj2961 共点圆 (CDQ分治, 凸包)
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #inc ...
随机推荐
- day16 类
初识面向对象 1. 面向过程: 一切以事物的流程为核心. 核心是"过程"二字, 过程是指解决问题的步骤, 即, 先干什么, 后⼲什么. 基于该思想编写程序就好比在编写一套流 ...
- React Native移动开发实战-3-实现页面间的数据传递
React Native使用props来实现页面间数据传递和通信.在React Native中,有两种方式可以存储和传递数据:props(属性)以及state(状态),其中: props通常是在父组件 ...
- Shader做剪影效果
某渣渣甩了一个需求给我,并且说我不会写.我明知是激将法,但是想想这需求也太简单了,我好像也不怎么会QAQ.为了表示我对shader的热爱,写就写. 需求是这样的: 这是一个漂亮的MM,但是渣渣不想让人 ...
- PHP 伪协议
1.file:// file://用于访问本地文件系统,不受allow_url_fopen影响 <?php include($_GET['file']); ?> 2.http:// GET ...
- Spring Data REST PATCH请求远程代码执行漏洞(CVE-2017-8046) 本地复现方法
#1背景 Spring Data REST是Spring Data项目的一部分,可以轻松地在Spring Data存储库之上构建超媒体驱动的REST Web服务. 恶意的PATCH请求使用精心构造 ...
- Python入门学习系列——Python文件和异常
从文件中读取数据 首先准备一个文本文件,文件中存储着普通文本数据.读取文件需要调用open()和read()函数. 读取整个文件 代码示例: with open('pi_digits.txt') as ...
- 最新的CocoaPods 安装及使用
当在开发iOS应用时,会经常使用到很多的第三方开源类库,一般的方法是直接从GitHub下载,然后拖到项目中使用,如果该开源类库不依赖其他的类库,就可以直接使用:如果该开源类库还依赖一些其他的类库,则需 ...
- 读取classpath配置文件的方法
http://www.cnblogs.com/sprinng/p/5622600.html
- 第九次作业psp
psp 进度条 代码累积折线图 博文累积折线图 psp饼状图
- BNUOJ 52305 Around the World 树形dp
题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...