【BZOJ4140】共点圆加强版(二进制分组)

题面

BZOJ

题解

我卡精度卡了一天。。。。

之前不强制在线的做法是\(CDQ\)分治,维护一个凸壳就好了。

现在改成二进制分组,每次重建凸壳就好了。。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 500500
#define Sqr(x) ((x)*(x))
#define pb push_back
struct Node{double x,y;}a[MAX];
bool operator<(Node a,Node b){if(a.x==b.x)return a.y<b.y;return a.x<b.x;}
inline double Slope(Node a,Node b)
{
if(a.x==b.x)return a.y>b.y?1e18:-1e18;
return (a.y-b.y)/(a.x-b.x);
}
int n,ans,top;
struct Group
{
vector<Node> p,Q;
int tot,tp;
void insert(Node x){++tot;p.pb(x);}
void clear(){p.clear();Q.clear();tot=tp=0;}
void Build()
{
sort(p.begin(),p.end());
tp=1;Q.clear();Q.pb(p[0]);
for(int i=1;i<tot;++i)
{
while(tp>1&&Slope(Q[tp-1],Q[tp-2])-Slope(Q[tp-1],p[i])>=0)--tp,Q.pop_back();
Q.pb(p[i]),++tp;
}
}
bool Query(double x,double y)
{
double k=-x/y;int l=1,r=tp-1,ret=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(k>=Slope(Q[mid],Q[mid-1]))l=mid+1,ret=mid;
else r=mid-1;
}
return 2*x*Q[ret].x+2*y*Q[ret].y>=x*x+y*y;
}
}B[50];
void insert(double x,double y)
{
B[++top].insert((Node){x,y});
while(top>1&&B[top].tot==B[top-1].tot)
{
for(int i=0;i<B[top].tot;++i)
B[top-1].insert(B[top].p[i]);
B[top--].clear();
}
B[top].Build();
}
bool Query(double x,double y)
{
if(!top)return false;
for(int i=1;i<=top;++i)
if(!B[i].Query(x,y))return false;
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
int opt;double x,y;
scanf("%d%lf%lf",&opt,&x,&y);
x+=ans;y+=ans;
if(!opt)insert(x,y);
else if(Query(x,y))++ans,puts("Yes");else puts("No");
}
return 0;
}

【BZOJ4140】共点圆加强版(二进制分组)的更多相关文章

  1. BZOJ4140 : 共点圆加强版

    假设当前询问点为$(A,B)$,那么它在一个以$(x,y)$为圆心的圆里需要满足: $(x-A)^2+(y-B)^2\leq x^2+y^2$ $2Ax+2By\geq A^2+B^2$ 等价于询问所 ...

  2. bzoj2961&&bzoj4140 共点圆

    题目描述 在平面直角坐标系中,Wayne需要你完成n次操作,操作只有两种: 1.0 x y.表示在坐标系中加入一个以(x, y)为圆心且过原点的圆. 2.1 x y.表示询问点(x, y)是否在所有已 ...

  3. 【Codeforces710F】String Set Queries (强制在线)AC自动机 + 二进制分组

    F. String Set Queries time limit per test:3 seconds memory limit per test:768 megabytes input:standa ...

  4. BZOJ2989 数列(二进制分组)

    这题其实可以cdq分治做,但是如果强制在线的话,这里有个牛逼方法叫二进制分组. 它的基本思想是把修改操作按二进制分组,遇到修改就在尾部加一个,并与之前的合并,比如之前有23(16+4+2+1)个,加了 ...

  5. bzoj2961 共点圆 bzoj 4140

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

  6. 【BZOJ3821/UOJ46】玄学(二进制分组,线段树)

    [BZOJ3821/UOJ46]玄学(二进制分组,线段树) 题面 BZOJ UOJ 题解 呜,很好的题目啊QwQ. 离线做法大概可以线段树分治,或者直接点记录左右两次操作时的结果,两个除一下就可以直接 ...

  7. bzoj2989&&4170数列——二进制分组+主席树

    题意的转化挺巧妙的 可以联想到曼哈顿距离! 并且,所谓的修改还要查询历史版本,并且修改之间不动只算一次,不就是给平面上加一个点吗? 看成(x,a[x])的点 就是一个菱形区域 转切比雪夫距离,变成矩形 ...

  8. CodeForces - 710F:String Set Queries (二进制分组 处理 在线AC自动机)

    ou should process m queries over a set D of strings. Each query is one of three kinds: Add a string ...

  9. 2019.01.21 bzoj2989: 数列(二进制分组+主席树)

    传送门 二进制分组入门题. 主席树写错调题2h+2h+2h+体验极差. 题意简述:给一堆点,支持加入一个点,询问有多少个点跟(x,y)(x,y)(x,y)曼哈顿距离不超过kkk. 思路:题目要求的是对 ...

随机推荐

  1. python属性访问

    1.python属性访问魔法方法: >>> class C: def __getattribute__(self,name): print("getattribute&qu ...

  2. Jmeter关联处理

    采桑子·重阳 人生易老天难老, 岁岁重阳. 今又重阳, 战地黄花分外香. 一年一度秋风劲, 不似春光. 胜似春光, 廖廓江天万里霜. 当请求之间有依赖关系,比如一个请求的入参是另一个请求返回的数据,这 ...

  3. Hadoop初步简介

    Hadoop产生背景: 传统方式,我们使用数据库来对数据进行管理.可是随着数据量的增加,我们要对这个数据库中的海量数据进行处理, 从中提取出有效的信息,这时候面临的问题随之而来: 1.海量数据读取,采 ...

  4. 关于spring boot 使用 mybatis plus INSERT的时候id报错

    mybatis plus 在INSERT的时候会默认自动设置插入id 我当时数据库采用的id自增. 在使用插入语句的时候并没有set  ID 但是它默认给了一大串 更改mybatis plus全局配置 ...

  5. Docker--删除容器实例和镜像

    一.删除容器实例 使用命令docker rm 容器ID或者容器名 1.docker ps -a查询已有的实例 [root@cxt data]# docker ps -a 2.docker rm 容器I ...

  6. 学习python最难的就是入门,而这文章刚好适合初学者!

    Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.Dropbox.BT ...

  7. Docker 私有仓库方案比较与搭建

    我们知道docker镜像可以托管到dockerhub中,跟代码库托管到github是一个道理.但如果我们不想把docker镜像公开放到dockerhub中,只想在部门或团队内部共享docker镜像,能 ...

  8. 小刘的深度学习---CNN

    前言: 前段时间我在树莓派上通过KNN,SVM等机器学习的算法实现了门派识别的项目,所用到的数据集是经典的MNIST.可能是因为手写数字与印刷体存在一些区别,识别率并是很不高.基于这样的情况,我打算在 ...

  9. 解决SecureCRT小键盘乱码

    SecureCRT软件菜单,Options -> Session Options ->Terminal -> Emulation,右侧面板中"Terminal"选 ...

  10. vs2013 CodeLens

    那东西叫 CodeLens  只有VS2013 旗舰版 (update 2及以上) 才可以用,高级版 专业版都没有.如何打开CodeLens呢?在VS菜单栏 >> 工具 >> ...