题目描述

  在平面直角坐标系中,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. kubernetes高可用设计-master节点和kubectl

    部署master 节点 上一遍是CA证书和etcd的部署,这一篇继续搭建k8s,废话不多说.开始部署. kubernetes master 节点包含的组件有: kube-apiserver kube- ...

  2. 重磅发布 | 黑镜调查:深渊背后的真相之「DDoS 威胁与黑灰产业调查报告」

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室发表于云+社区专栏 本文经授权转载自 FreeBuf 2018年世界杯硝烟散尽,但关于她的话题却远远没有结束.说起世界杯,就 ...

  3. 最新Python笔试题2017 涵盖知识面广泛

    引言 想找一份Python开发工作吗?那你很可能得证明自己知道如何使用Python.下面这些问题涉及了与Python相关的许多技能,问题的关注点主要是语言本身,不是某个特定的包或模块.每一个问题都可以 ...

  4. SpringBoot集成dubbo实例

    项目总览图: 最下面有项目的pom,具体内容: 项目运行注意事项: 先启动 provider, 将providers.xml中 port 先修改为20187 执行test目录 下的DubboProvi ...

  5. SQL 查一年内的数据

    --查询今年的 select * from 表 where datediff(yy,时间字段,GETDATE())=0 --查询去年的 select * from 表 where datediff(y ...

  6. Daily Scrum1 11.3

    今天是我们团队进入代码实现阶段的第一天,经过一周对上一届项目代码的阅读和研究,队员们已经从代码中分析出我们这次项目将要修改和补充的地方,我们接下来要做的地方就是在两周的时间内将团队项目在alpha阶段 ...

  7. “私人助手”Beta版使用说明

    私人助手(Beta)版使用说明 私人助手这款软件是通过添加事件提醒功能,让用户能在正确的时间做正确的事情,使得工作变得更有效率,而这款软件的特色在于提醒模式的添加,用户可以通过震动.铃声提醒,我们的特 ...

  8. 《TCP/IP 详解 卷1:协议》第 2 章:Internet 地址结构

    第二章介绍 Internet 使用的网络层地址,即熟知的 IP 地址.连接到 Internet 的设备,基于 TCP/IP 的专用网络中使用的设备都需要一个 IP 地址. 路由器(见 IP 协议 一章 ...

  9. 对WEB url 发送POST请求

    package com.excellence.spark; import java.util.List; import com.excellence.spark.test.test; import c ...

  10. week4f:个人博客作业

    8,工作中的照片 9,对方编程习惯总结 宋成鑫(以后简称老宋).老宋,对编程的思想看的比较重,具体什么是编程的思想,我是也不是很清楚.但是,在编程过程中,老宋的一些话给了我启示.这或许就是编程的思想吧 ...