题目大意

两种操作

1)插入一个过原点的圆

2)询问一个点是否在所有的圆中

分析

在圆中则在半径范围内

设圆心 \(x,y\) 查询点\(x_0,y_0\)

则\(\sqrt{(x-x_0)^2+(y-y_0)^2} <= \sqrt{x^2+y^2}\)

解得\(2x_0 * x+2y_0 *y -(x_0^2+y_0^2)>=0\)

x,y 为变量

是个半平面的式子

题意变成

1)插入一个点

2)询问是否所有点都在半平面内

插入互不干扰

点都在半平面内当且仅当凸包在半平面内

cdq,维护上下凸包,三分找出离直线最近的点

(凸包上点与直线的叉积是单峰的)

solution

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cmath>
#include <algorithm>
using namespace std;
typedef double db;
const int M=500007; inline int rd(){
int x=0;bool f=1;char c=getchar();
for(;!isdigit(c);c=getchar()) if(c=='-') f=0;
for(;isdigit(c);c=getchar()) x=x*10+c-48;
return f?x:-x;
} int m,n,nup,ndw; struct pt{
db x,y;
pt(db X=0.0,db Y=0.0){x=X;y=Y;}
}p[M],up[M],dw[M]; struct node{
int kd;
pt d;
node(int kk=0,pt pp=pt()){kd=kk;d=pp;}
}opr[M]; struct line{
pt P,v;
line(pt pp=pt(),pt vv=pt()){P=pp; v=vv;}
}; bool ans[M]; bool operator <(pt x,pt y){return (x.x!=y.x)?(x.x<y.x):(x.y<y.y);}
pt operator +(pt x,pt y){return pt(x.x+y.x,x.y+y.y);}
pt operator -(pt x,pt y){return pt(x.x-y.x,x.y-y.y);}
pt operator *(pt x,db d){return pt(x.x*d,x.y*d);}
pt operator /(pt x,db d){return pt(x.x/d,x.y/d);} db dot(pt x,pt y){
return x.x*y.x+x.y*y.y;
} db cross(pt x,pt y){
return x.x*y.y-x.y*y.x;
} db length(pt x){
return sqrt(dot(x,x));
} db shadow(pt x,pt y,pt to){
return dot(y-x,to-x)/length(to-x);
} db area(pt x,pt y,pt z){
return cross(y-x,z-x);
} void convex(){
sort(p+1,p+n+1); int i;
nup=0;
for(i=1;i<=n;i++){
while(nup>1&&area(up[nup-1],up[nup],p[i])>=0) nup--;
up[++nup]=p[i];
} ndw=0;
for(i=1;i<=n;i++){
while(ndw>1&&area(dw[ndw-1],p[i],dw[ndw])>=0) ndw--;
dw[++ndw]=p[i];
}
} bool check(pt x){
if(x.y==0){
return x.x <= 2*up[1].x;
}
else{
line nw=line(pt(0,dot(x,x)/(2.0*x.y)),pt(1,-x.x/x.y));
if(x.y>0){
int l=1,r=ndw,m1,m2,len;
db tp1,tp2;
while(l+1<r){
len=(r-l+1)/3;
m1=l+len;
m2=m1+len;
tp1=cross(nw.v,dw[m1]-nw.P);
tp2=cross(nw.v,dw[m2]-nw.P);
if(tp1<0||tp2<0) return 0;
if(tp1<tp2) r=m2-1;
else l=m1+1;
}
tp1=cross(nw.v,dw[l]-nw.P);
tp2=cross(nw.v,dw[r]-nw.P);
if(tp1<0||tp2<0) return 0;
}
else{
int l=1,r=nup,m1,m2,len;
db tp1,tp2;
while(l+1<r){
len=(r-l+1)/3;
m1=l+len;
m2=m1+len;
tp1=cross(nw.v,up[m1]-nw.P);
tp2=cross(nw.v,up[m2]-nw.P);
if(tp1<0||tp2<0) return 0;
if(tp1<tp2) l=m1+1;
else r=m2-1;
}
tp1=cross(nw.v,up[l]-nw.P);
tp2=cross(nw.v,up[r]-nw.P);
if(tp1<0||tp2<0) return 0;
}
}
return 1;
} void solve(int l,int r){
if(l>=r) return;
int mid=l+r>>1,i;
solve(l,mid);
solve(mid+1,r);
for(n=0,i=l;i<=mid;i++)
if(opr[i].kd==0) p[++n]=opr[i].d;
if(n==0) return;
convex();
for(i=mid+1;i<=r;i++)
if(opr[i].kd==1&&ans[i]){
ans[i]=check(opr[i].d);
}
} int main(){
db x,y;
int i,kd; m=rd();
bool ok=0;
for(i=1;i<=m;i++){
kd=rd();
if(kd==0) ok=1;
scanf("%lf%lf",&x,&y);
opr[i]=node(kd,pt(x,y));
ans[i]=ok;
} solve(1,m); for(i=1;i<=m;i++)
if(opr[i].kd==1) puts(ans[i]?"Yes":"No"); return 0;
}

bzoj 2961 共点圆 cdq+凸包+三分的更多相关文章

  1. [BZOJ2961] 共点圆 [cdq分治+凸包]

    题面 BZOJ传送门 思路 首先考虑一个点$(x_0,y_0)$什么时候在一个圆$(x_1,y_1,\sqrt{x_1^2+y_1^2})$内 显然有:$x_1^2+y_1^2\geq (x_0-x_ ...

  2. BZOJ2961 共点圆[CDQ分治]

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

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

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

  4. bzoj 4311 向量 时间线建线段树+凸包+三分

    题目大意 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 分析 按时间线建线段树 大致 ...

  5. bzoj 3533 [Sdoi2014]向量集 线段树+凸包+三分(+动态开数组) 好题

    题目大意 维护一个向量集合,在线支持以下操作: "A x y (|x|,|y| < =10^8)":加入向量(x,y); "Q x y l r (|x|,|y| & ...

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

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

  7. BZOJ2961: 共点圆(CDQ分治+凸包)

    题面 传送门 题解 这题解法真是多啊--据说可以圆反演转化为动态插入半平面并判断给定点是否在半平面交中,或者化一下改成给定点判断是否所有点都在某一个半平面内-- 鉴于圆反演我也不会,这里讲一下直接推的 ...

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

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

  9. [BZOJ2961]共点圆-[凸包+cdq分治]

    Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+ ...

随机推荐

  1. C++内联函数、宏定义和普通函数的区别

    C++内联函数.宏定义和普通函数的区别? 宏定义:在预处理阶段进行简单的文本替换,不会进行参数类型检查: 内联函数:在编译器的时候进行代码插入,编译器会在每次调用内联函数的地方直接将内联函数的内容展开 ...

  2. 有关SQL的一道面试题

    这是一个学生分数表 StudentName            StudySubject           SubjectScore Peter                           ...

  3. 解决Windows 与Mac 双系统下的蓝牙设备共用的问题

    不知道有多少人和我一样用的蓝牙鼠标或者键盘,有的话应该都会遇到同一个问题:即在一个系统下配好对后在另一个系统必须重新配对才能使用,很是麻烦.还要将蓝牙设备进入发现模式,OS下搜索,连接....终于昨天 ...

  4. NOIP模拟赛 czy的后宫

    [题目描述] czy要妥善安排他的后宫,他想在机房摆一群妹子,一共有n个位置排成一排,每个位置可以摆妹子也可以不摆妹子.有些类型妹子如果摆在相邻的位置(隔着一个空的位置不算相邻),就不好看了.假定每种 ...

  5. Struts2和SpringMVC简单配置以及区别总结

    Struts2: struts 2 是一个基于MVC(mode-view-con)设计模式的Web应用框架,是由Struts1和WebWork两个经典框架发展而来的. 工作流程: 1客户端浏览器发出H ...

  6. 14Shell脚本—判断语句

    判断语句 Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值. 条件测试语法的执行格式为 [ 条件表达式 ],切记,条件表达式两边均应有一个空格. 条 ...

  7. windows下配置Nginx支持php

    编辑配置文件nginx.conf worker_processes 1; events { worker_connections 1024; } http { include mime.types; ...

  8. nginx静态资源web服务

    静态资源:非服务器动态运行生成的文件 浏览器端渲染:html ,css,js 图片:jpeg,gif,png 视频:flv ,mpeg 文件:txt,等任意下载文件 静态资源服务场景:CDN 文件读取 ...

  9. 【linux】文件默认权限:umask

    在默认权限的属性上,目录与文件是不一样的.从第六章我们知道 x 权限对於目录是非常重要的! 但是一般文件的创建则不应该有运行的权限,因为一般文件通常是用在於数据的记录嘛!当然不需要运行的权限了. 因此 ...

  10. 用Python设置matplotlib.plot的坐标轴刻度间隔以及刻度范围

    一.用默认设置绘制折线图 import matplotlib.pyplot as plt x_values=list(range(11)) #x轴的数字是0到10这11个整数 y_values=[x* ...