题目描述

  在平面直角坐标系中,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 共点圆的更多相关文章

  1. 【BZOJ2961】共点圆(CDQ分治)

    [BZOJ2961]共点圆(CDQ分治) 题面 BZOJ 题解 设询问点\((x,y)\),圆心是\((X,Y)\) 那么如果点在园内的话就需要满足 \((X-x)^2+(Y-y)^2\le X^2+ ...

  2. 【bzoj2961】 共点圆

    http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...

  3. BZOJ4140 : 共点圆加强版

    假设当前询问点为$(A,B)$,那么它在一个以$(x,y)$为圆心的圆里需要满足: $(x-A)^2+(y-B)^2\leq x^2+y^2$ $2Ax+2By\geq A^2+B^2$ 等价于询问所 ...

  4. 【bzoj2961】共点圆 k-d树

    更新:此题我的代码设置eps=1e-8会WA,现在改为1e-9貌似T了 此题网上的大部分做法是cdq分治+凸包,然而我觉得太烦了,于是自己口胡了一个k-d树做法: 加入一个圆$(x,y)$,直接在k- ...

  5. 【BZOJ4140】共点圆加强版(二进制分组)

    [BZOJ4140]共点圆加强版(二进制分组) 题面 BZOJ 题解 我卡精度卡了一天.... 之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了. 现在改成二进制分组,每次重建凸壳就好了. ...

  6. BZOJ2961: 共点圆

    好久没发了 CDQ分治,具体做法见XHR的论文… /************************************************************** Problem: 29 ...

  7. BZOJ2961 共点圆[CDQ分治]

    题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...

  8. bzoj2961 共点圆 bzoj 4140

    题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...

  9. bzoj2961 共点圆 (CDQ分治, 凸包)

    /* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #inc ...

随机推荐

  1. 使用Python 统计nginx日志前十ip访问量并以柱状图显示

    脚本内容: import matplotlib.pyplot as plt # nginx_file = '10.6.11.91_access.log-2018-12-27' ip = {} #筛选n ...

  2. virtual box下安装ubuntu经验

    1. 哪怕下载的是ubuntu64位版本,也在vitualbox下选择ubuntu而不要选择ubuntu(64bit) 2. 安装VBoxGuestAdditional.iso:下载和vbox版本相匹 ...

  3. 如何在静态方法或非Spring Bean中注入Spring Bean

           在项目中有时需要根据需要在自己new一个对象,或者在某些util方法或属性中获取Spring Bean对象,从而完成某些工作,但是由于自己new的对象和util方法并不是受Spring所 ...

  4. eclipse在线安装maven插件

    http://blog.csdn.net/xiaoxiaoyeyaya/article/details/17200987 在安装插件的时候将下面的contact all update sites du ...

  5. MySql 赋值操作符"="与":="

    MySql小点心—1.赋值操作符"="与":=" 对于刚接触到mysql的程序员来说,会对这两个符号有疑问,因为会发现有的代码里用这个有的用另一个. 当然他们是 ...

  6. Daily Scrum 11.18

    今日完成任务: 1.在提问问题的时候为问题创建索引 2.解决了修改个人资料后刷新没有更新的问题 3.初步加入了采纳功能(没完善UI设计) 遇到困难:创建索引之后,跳转到主页,需要重新登录,找了半天不知 ...

  7. java 实验1

    北京电子科技学院(BESTI) 实     验    报     告 课程:Java程序设计 班级:1352 姓名:杨光 学号:20135233 成绩:            指导教师:娄嘉鹏  实验 ...

  8. 20162319 实验四 Android程序设计

    Android Stuidio的安装测试: 完成Hello World, 要求修改res目录中的内容,Hello World后要显示自己的学号 ·实验过程 完成任务一,只需在Android应用程序文件 ...

  9. In-band Network Function Telemetry

    文章名称:In-band Network Function Telemetry 发表时间:2018 期刊来源:SIGCOMM I Introduction (介绍) NFV运行在商品服务器上,在网络功 ...

  10. 一致性Hash算法(KetamaHash)的c#实现

    Consistent Hashing最大限度地抑制了hash键的重新分布.另外要取得比较好的负载均衡的效果,往往在服务器数量比较少的时候需要增加虚拟节点来保证服务器能均匀的分布在圆环上.因为使用一般的 ...