【BZOJ2961】共点圆(CDQ分治)
【BZOJ2961】共点圆(CDQ分治)
题面
题解
设询问点\((x,y)\),圆心是\((X,Y)\)
那么如果点在园内的话就需要满足
\((X-x)^2+(Y-y)^2\le X^2+Y^2\)
拆开之后就变成了
\(x^2+y^2-2xX\le 2yY\)
除过去就是\(-\frac{x}{y}X+\frac{x^2+y^2}{2y}\le Y\)
显然左边是一个直线,那么,这个式子的含义就是,
对于任意\((X,Y)\),在\(X\)处的函数值都要小于\(Y\),
即这个直线在所有的圆心下方。
那么维护一下下凸壳,每次拿斜率去切凸壳,检查一下截距就好了。
当然,上面是假装\(y>0\),如果\(y<0\)的话需要变号,变成了所有圆心都在直线的下方了
这里需要维护一个上凸壳。
用\(CDQ\)分治就可以很好的维护这些东西了。
然而我这个傻逼这都不会写
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define ll long long
#define MAX 500500
#define Sqr(x) ((x)*(x))
const double eps=1e-8;
struct Opt{int op,id;double x,y,k;}p[MAX],tmp[MAX],S1[MAX],S2[MAX];
bool operator<(Opt a,Opt b){return a.k<b.k;}
bool cmp(Opt a,Opt b){return a.id<b.id;}
double Slope(Opt a,Opt b)
{
if(fabs(a.x-b.x)<eps)return a.y<b.y?1e18:-1e18;
return (a.y-b.y)/(a.x-b.x);
}
double Dis(Opt a,Opt b){return sqrt(Sqr(a.x-b.x)+Sqr(a.y-b.y));}
bool ans[MAX];
int n;
void CDQ(int l,int r)
{
if(l==r)return;
int mid=(l+r)>>1,t1=l,t2=mid+1,tp1=0,tp2=0;
for(int i=l;i<=r;++i)
if(p[i].id<=mid)tmp[t1++]=p[i];
else tmp[t2++]=p[i];
for(int i=l;i<=r;++i)p[i]=tmp[i];
CDQ(l,mid);
for(int i=l;i<=mid;++i)
{
if(p[i].op)continue;
while(tp1>1&&Slope(S1[tp1-1],p[i])+eps>Slope(S1[tp1-1],S1[tp1]))--tp1;S1[++tp1]=p[i];
while(tp2>1&&Slope(S2[tp2-1],p[i])-eps<Slope(S2[tp2-1],S2[tp2]))--tp2;S2[++tp2]=p[i];
}
t1=tp1,t2=1;
for(int i=mid+1;i<=r;++i)
{
if(!p[i].op)continue;
if(p[i].y<0)
{
while(t1>1&&Slope(S1[t1-1],S1[t1])<p[i].k)--t1;
if(t1>0&&Dis(S1[t1],S1[0])<Dis(S1[t1],p[i]))ans[p[i].id]=false;
}
else
{
while(t2<tp2&&Slope(S2[t2],S2[t2+1])<p[i].k)++t2;
if(t2<=tp2&&Dis(S2[t2],S2[0])<Dis(S2[t2],p[i]))ans[p[i].id]=false;
}
}
CDQ(mid+1,r);
t1=l;t2=mid+1;
for(int i=l;i<=r;++i)
if(t2>r||(t1<=mid&&p[t1].x<p[t2].x))tmp[i]=p[t1++];
else tmp[i]=p[t2++];
for(int i=l;i<=r;++i)p[i]=tmp[i];
}
int main()
{
freopen("2961.in","r",stdin);
freopen("2961.out","w",stdout);
ios::sync_with_stdio(false);
cin>>n;
for(int i=1,opt,sum=0;i<=n;++i)
{
double x,y;
cin>>opt>>x>>y;
if(opt==0)p[i]=(Opt){0,i,x,y,0},++sum;
else p[i]=(Opt){1,i,x,y,0};
if(fabs(y)>eps)p[i].k=-x/y;else p[i].k=1e18;
if(opt==1)ans[i]=(bool)sum;
}
sort(&p[1],&p[n+1]);CDQ(1,n);
sort(&p[1],&p[n+1],cmp);
for(int i=1;i<=n;++i)if(p[i].op)puts(ans[i]?"Yes":"No");
return 0;
}
【BZOJ2961】共点圆(CDQ分治)的更多相关文章
- [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_ ...
- BZOJ2961 共点圆[CDQ分治]
题面 bzoj 其实就是推一下圆的式子 长成这个样子 假设要查询的点是(x, y) 某个圆心是(p, q) \((x - p)^2 + (y - q)^2 \leq p^2 + q^2\) 变成 \( ...
- bzoj2961 共点圆 (CDQ分治, 凸包)
/* 可以发现可行的圆心相对于我们要查询的点是在一个半平面上, 然后我们要做的就是动态维护凸壳然后用这个半平面去切它 看看是否是在合法的那一面 然后cdq分治就可以了 代码基本是抄的, */ #inc ...
- BZOJ2961: 共点圆(CDQ分治+凸包)
题面 传送门 题解 这题解法真是多啊--据说可以圆反演转化为动态插入半平面并判断给定点是否在半平面交中,或者化一下改成给定点判断是否所有点都在某一个半平面内-- 鉴于圆反演我也不会,这里讲一下直接推的 ...
- BZOJ2961: 共点圆
好久没发了 CDQ分治,具体做法见XHR的论文… /************************************************************** Problem: 29 ...
- bzoj2961 共点圆 bzoj 4140
题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...
- [BZOJ2961]共点圆-[凸包+cdq分治]
Description 传送门 Solution 考虑对于每一个点: 设圆的坐标为(x,y),点的坐标为(x0,y0).依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+ ...
- bzoj 2961 共点圆 cdq+凸包+三分
题目大意 两种操作 1)插入一个过原点的圆 2)询问一个点是否在所有的圆中 分析 在圆中则在半径范围内 设圆心 \(x,y\) 查询点\(x_0,y_0\) 则\(\sqrt{(x-x_0)^2+(y ...
- 【bzoj2961】 共点圆
http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...
随机推荐
- Mac os x 配置maven
安装Maven 1.压缩包apache-maven-3.3.9-bin.zip 2.解压压缩包到指定文件 3.打开终端,输入以下命令,编辑环境变量文件:bash_proflie open .bash_ ...
- prometheus-operator 监控 Rabbitmq集群
首先我们监控服务需要知道prometheus-operator是如何去工作的,才好去写相关的yaml配置,这里我划分成了5个部分,如果容器服务本身就以k8s来编排的,那就只需要三步,这里因为我的rab ...
- decode 函数及其用法
http://blog.csdn.net/oscar999/article/details/18399177
- oracle和mysql在sql中生成uuid的方法
1,oracle sys_guid() 2,mysql uuid()
- BugPhobia开发篇章:绩效管理的层次优化
0x00 :用0x00去书写一段故事 If you weeped for the missing sunset, you would miss all the shining stars 绩效管理,恐 ...
- JAVA第一次实验 ——凯撒密码
课程:Java程序设计 班级:1352 姓名:黄伟业 学号:20135215 成绩: 指导教师:娄嘉鹏 实验日期:2015.4.15 实验密级: 预习程度: 实验时间:19: ...
- java实验1实验报告(20135232王玥)
实验一 Java开发环境的熟悉 一.实验内容 1. 使用JDK编译.运行简单的Java程序 2.使用Eclipse 编辑.编译.运行.调试Java程序 二.实验要求 1.没有Linux基础的同学建议先 ...
- Java导出引用jar包的文件
安装Eclipse打包插件Fat Jar 方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐.这时可以使用一个打包的插件-Fat Jar. Fat Jar ...
- 关于datatable的数据绑定问题
最近做项目掉在数据绑定这个小坑里了,最后发现问题其实很简单,只是官方的文档描述可能不太清除导致的吧.首先贴上官网地址:http://www.datatables.club/ 关于这个插件的简单使用就不 ...
- MiniUI合并单元格
function onload(e){ var grid = e.sender; var len = grid.data.length; var data= grid.data; ,num=; var ...