Description

传送门

Solution

考虑对于每一个点:

设圆的坐标为(x,y),点的坐标为(x0,y0)。依题意得,当一个点在圆里,需要满足(x-x0)2+(y-y0)2<=x2+y2

化简得x02+y02<=2x0*x+2y0*y。

当y0>0,x*(-x0/y0)+0.5y0+x02/(2*y0)<=y,这是一个半平面的式子;当y0<0时同理,但是要变号。

所以对于某个点(x0,y0),我们构造出在它前面所有圆心的凸包。凸包应分为上下。

通过以上式子我们可以得出,当y0>0时应在下凸包上找点(x,y)【该点为直线y=-x0/y0与下凸包的切点,即若此点满足要求,其他任何点都会满足要求。通过这个条件,我们也可以理解把该点理解为2x0*x+2y0*y最小的点】,反之则应该在上凸包上找。

好的让我们假设目前的y0>0,由于凸包上的点(x,y)是按极角排序,x*x0+y*y0是单峰的(这个式子是向量的点乘,其几何意义为:向量a点乘向量b=向量a的长度*向量b的长度*cos(向量a,b的夹角)。所以根据这个定义,证明,就画图吧。qaq正儿八经公式太麻烦了。)上凸包也是一样的。

Code

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
const double eps=1e-;
int n;
bool ans[];
struct W{
int tp;double x,y;
friend double operator *(W a,W b){return a.x*b.y-a.y*b.x;}
friend double operator ^(W a,W b){return a.x*b.x+a.y*b.y;}
friend W operator -(W a,W b){return W{,a.x-b.x,a.y-b.y};}
friend bool operator <(W a,W b){return (fabs(a.x-b.x)<eps)?a.y<b.y:a.x<b.x;}
}w[],t[],st[][];//st[0]-上凸包,st[1]-下凸包
double ask(W a,W b){return a.x*b.x+a.y*b.y;}
bool _ok[];
int top0,top1;
bool query(int id)
{
int l,r,mid1,mid2;double minn=1e12;
if (w[id].y<)
{
l=;r=top0;
while (r-l>)
{
mid1=(l*+r)/;mid2=(r*+l)/;
if ((w[id]^st[][mid1])<(w[id]^st[][mid2])) r=mid2;
else l=mid1;
}
for (int i=l;i<=r;i++) minn=min(minn,w[id]^st[][i]); } else
{
l=;r=top1;
while (r-l>)
{
mid1=(l*+r)/;mid2=(r*+l)/;
if ((w[id]^st[][mid1])<(w[id]^st[][mid2])) r=mid2;
else l=mid1;
}
for (int i=l;i<=r;i++) minn=min(minn,w[id]^st[][i]);
}
if (*minn-(w[id].x*w[id].x+w[id].y*w[id].y)<eps) ans[id]=; }
void solve(int l,int r)
{
if (l==r) return;
int mid=(l+r)/,tot=;
solve(l,mid);
solve(mid+,r);
for (int i=l;i<=mid;i++) if (!w[i].tp) t[++tot]=w[i];
sort(t+,t+tot+);
top1=,top0=;
for (int i=;i<=tot;i++)
{
while (top0>&&(st[][top0]-st[][top0-])*(t[i]-st[][top0])>-eps) top0--;
st[][++top0]=t[i];
}
st[][top0+].x=st[][top0].x;st[][top0+].y=-1e12;
for (int i=tot;i;i--)
{
while (top1>&&(st[][top1]-st[][top1-])*(t[i]-st[][top1])>-eps) top1--;
st[][++top1]=t[i];
}
st[][top1+].x=st[][top1].x;st[][top1+].y=1e12;
for (int i=mid+;i<=r;i++) if (w[i].tp&&ans[i]) query(i);
}
bool _is=;
int main()
{
scanf("%d",&n);
for (int i=;i<=n;i++)
{
scanf("%d%lf%lf",&w[i].tp,&w[i].x,&w[i].y);
if (!w[i].tp) _is=;else ans[i]=_is;
}
solve(,n);
for (int i=;i<=n;i++) if (w[i].tp)
if (ans[i]) printf("Yes\n");else printf("No\n");
}

[BZOJ2961]共点圆-[凸包+cdq分治]的更多相关文章

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

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

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

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

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

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

  4. [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_ ...

  5. BZOJ2961 共点圆[CDQ分治]

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

  6. bzoj2961 共点圆 bzoj 4140

    题解: 比较水的一道题 首先我们化简一下式子发现是维护xxo+yyo的最值 显然是用凸包来做 我们可以直接用支持插入删除的凸包 也是nlogn的 因为没有强制在线,我们也可以cdq,考虑前面一半对答案 ...

  7. BZOJ2961: 共点圆

    好久没发了 CDQ分治,具体做法见XHR的论文… /************************************************************** Problem: 29 ...

  8. 【bzoj2961】 共点圆

    http://www.lydsy.com/JudgeOnline/problem.php?id=2961 (题目链接) 题意 按照一定的顺序给出一些圆和一些点,对于每一个点问是否在所有圆内. Solu ...

  9. Bzoj2149拆迁队:cdq分治 凸包

    国际惯例的题面:我们考虑大力DP.首先重新定义代价为:1e13*选择数量-(总高度+总补偿).这样我们只需要一个long long就能维护.然后重新定义高度为heighti - i,这样我们能选择高度 ...

随机推荐

  1. 0-创建scott数据

    CREATE TABLE dept (  deptno INT PRIMARY KEY,  dname VARCHAR(14),  loc VARCHAR(13) );   INSERT INTO d ...

  2. 弹框插件self(动效兼容到IE9,功能兼容IE6)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. 34、springboot的热部署

    热部署 在开发中我们修改一个Java文件后想看到效果不得不重启应用,这导致大量时间花费, 我们希望不重启应用的情况下,程序可以自动部署(热部署).有以下四种情况,如何能实现热部署. 1.模板引擎 在S ...

  4. JSTL的下载和配置

    1,首先在输入网址http://www.oracle.com/technetwork/java/jstl-137486.html 2,单击红色图标所示 3,单击Download 4,单击JSTL Im ...

  5. 修改linux系统的默认语言

    修改linux系统的默认语言: 1.全局修改:         所有用户都是同一种统一的语言设置          修改/etc/sysconfig/i18n文件          vi /etc/s ...

  6. PAT——1074. 宇宙无敌加法器(20)

    地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在PAT星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每个PAT星人都必须熟记各位数字的进制表,例如 ...

  7. DPDK安装依赖项合集 环境合集

    前言 在dpdk编译过程中,由于一些依赖项的限制,dpdk在纯净的系统上安装需要花一些功夫.本文总结了编译dpdk所需的依赖项,并归纳了安装合集,在安装过程上可以省下大量的搜索时间. 使用系统 ubu ...

  8. CC2640R2F&TI-RTOS 拿到 TI CC2640R2F 开发板 第一件事就是移植串口驱动,重定向 printf

    /* * board_uart.c * * Created on: 2018年7月3日 * Author: admin */ #include "board_uart.h" #in ...

  9. lwip TCP client 客户端 & FreeRTOS

    static void tcpecho_thread(void *arg) { ip_addr_t serverIpAddr; struct netbuf *buf; void *data; u16_ ...

  10. Oracle 安全性一

    创建和管理数据库用户账户 用户账户属性 用户账户拥有很多在创建账户时定义的属性.这些属性将应用于连接到账户的会话,在会话运行期间,DBA或会话可以更改其中一些属性. 用户名 身份验证方法 默认表空间 ...