题目描述

  在平面直角坐标系中,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. 大牛都是这样写测试用例的,你get到了嘛?

    1. 用于语句覆盖的基路径法 基路径法保证设计出的测试用例,使程序的每一个可执行语句至少执行一次,即实现语句覆盖.基路径法是理论与应用脱节的典型,基本上没有应用价值,读者稍作了解即可,不必理解和掌握. ...

  2. 铁轨(rails, ACM/ICPC CERC 1997,Uva 514)

    铁轨(rails, ACM/ICPC CERC 1997,Uva 514) 题目描述 某城市有一个火车站,铁轨铺设如图所示.有n节车厢从A方向驶入车站,按进站顺序编号为1~n.你的任务是让它们按照某种 ...

  3. 【机器学习】无监督学习Autoencoder和VAE

    众所周知,机器学习的训练数据之所以非常昂贵,是因为需要大量人工标注数据. autoencoder可以输入数据和输出数据维度相同,这样测试数据匹配时和训练数据的输出端直接匹配,从而实现无监督训练的效果. ...

  4. DenseNet——Densely Connected Convolutional Networks

    1. 摘要 传统的 L 层神经网络只有 L 个连接,DenseNet 的结构则有 L(L+1)/2 个连接,每一层都和前面的所有层进行连接,所以称之为密集连接的网络. 针对每一层网络,其前面所有层的特 ...

  5. unset命令详解

    基础命令学习目录首页 功能说明:unset是一个内建的Unix shell命令,在Bourne shell家族(sh.ksh.bash等)和C shell家族(csh.tcsh等)都有实现.它可以取消 ...

  6. Python交互数据库(Mysql | Mongodb | Redis)

    数据库 Mysql Mysql MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,后来被Sun公司收购,Sun公司后来又被Oracle公司收购,目前属于Oracle旗下产品 MyS ...

  7. [奇葩问题] ERROR 2013 (HY000): Lost connection to MySQL server during query

    查询一条耗时30s以上语句,实际为2分钟多. mysql> select version(); +------------+ | version() | +------------+ | 5.6 ...

  8. XSS攻击防御篇

    前言   上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...

  9. PHP Filter 函数 日常可用

    PHP Filter 函数 PHP Filesystem PHP FTP PHP Filter 简介 PHP 过滤器用于对来自非安全来源的数据(比如用户输入)进行验证和过滤. 安装 filter 函数 ...

  10. 5233杨光--Linux第二次实验

    实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 若不小心登出后,直接刷新页面即可 2. 环境使用 完成实验后可以点击桌面上方的“实验截图”保存并分享实 ...