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 ...
随机推荐
- Nginx内置的嵌入变量
Nginx核心模块ngx_http_core_module自带有许多内置嵌入的变量,这些变量方便我们配置和使用nginx,在nginx的配置文件中我们可以以$开头直接使用这些变量,这些变量表示客户端请 ...
- ROS (Robot Operating System) 相关资料与文档
本博文持续更新…… ROS学习与实践保护很多资料,最权威的当然是官网: www.ros.org 当然也有很多其他博文,尤其是中文文档有助于理解.2017推出一篇新博文,概况的资料较全. http:// ...
- linux递归查找文件内容并替换
sed -i 's/原字符串/替换后字符串/g' `grep '搜索关键字' -rl /data/目标目录/ --include "*.html"` 上面是递归查找目录中所有的HT ...
- 深度学习之神经网络核心原理与算法-caffe&keras框架图片分类
之前我们在使用cnn做图片分类的时候使用了CIFAR-10数据集 其他框架对于CIFAR-10的图片分类是怎么做的 来与TensorFlow做对比. Caffe Keras 安装 官方安装文档: ht ...
- PSP Daily软件beta版本——基于NABCD评论,及改进建议
1.根据(不限于)NABCD评论作品的选题: 此软件的用户人群较为明确,即:用户(软件工程课上学生)记录例行报告.写每周PSP表格和统计的需求.潜在用户还有未来该课堂的学生和需要用PSP方法记录任务完 ...
- Java将json字符串转成map
Map<String, Object> map = (Map<String, Object>) JSONUtils.parse(result)
- 20172321 2017-2018-2《Java程序设计》第三周学习总结
20172321 2017-2018-2<Java程序设计>第三周学习总结 教材学习内容总结 第三章要点: 要点1 :String类.Random类.Math类和枚举型,这几个是很有用的并 ...
- 20172322 实验一《Java开发环境的熟悉》实验报告
172322 2017-2018-2 <程序设计与数据结构>实验一报告 课程:<程序设计与数据结构> 班级: 1723 姓名: 张昊然 学号:20172322 实验教师:王志强 ...
- IO文件的读取,以及写入文件内容
package zxc; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.Fi ...
- TCP系列55—拥塞控制—18、其他拥塞控制算法及相关内容概述
前面我们演示分析了100+个wireshark TCP实例,拥塞控制部分也介绍常见的拥塞处理场景以及4种拥塞撤销机制,但是我们一直使用的都是reno拥塞控制算法.实际上拥塞控制发展到今天已经有了各种各 ...