【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 经典实例》 分享 pdf下载

    链接:https://pan.baidu.com/s/1FzSsBfynqx5ll_OpcZGDHg提取码:ykgk

  2. jmeter功能按钮介绍

    Jmeter本来是做性能测试的,所以有很多监听器都是针对性能的,随后边的不断发展,可以应用到接口自动化等测试工作上. 面板的文件菜单中一般都是打开.保存.新建测试的,如下图: 保存时可以直接ctrl+ ...

  3. spring boot之创建web项目并访问jsp页面

    1,创建spring boot的web项目 刚创建好的项目路径如下: 2,pom中要有下面的依赖 <dependency> <groupId>org.springframewo ...

  4. second scrum meeting - 151026

    摘要:这一周的工作其实进行的并没有很迅速~不过我们团队的每个人都在慢慢进行自己的工作,并且我们也完成了大致的页面设计,开发了主页面的框架,并且我们也会开始着手学习服务器的操作,还有更加完善主页面的框架 ...

  5. spring冲刺第十天

    调试运行,对整体的游戏方面进行改进.冲刺完了,但依然有很多问题,比如无法暂停,游戏结束后只能退出重来等

  6. java 线程的简单理解

    想要实现线程可以继承Thread也可以实现接口runnable,在类中重写 run()方法在主函数调用start方法就可以开辟线程. 对于java对象都有一个wait()和notify().notif ...

  7. flownet2.0 caffe anaconda2 编译安装

    1. 下载flownet2.0源码到指定目录 cd /home/zzq/saliency_models/deep_optical_flow git clone https://github.com/l ...

  8. 手机访问本地php项目遇到的问题及解决

    做html5的本地应用要调试后台,学了下php 按照和连j2ee的时候一样,电脑发射wifi,ipconfig..等等  发现tomcat的可以访问,apache的不能访问,搜索好久,没找到解答, j ...

  9. “吃神么,买神么”的第三个Sprint冲刺总结

    第三阶段Spring的目标以及完成情况: 时间:6.16——6.26(10天) 目标:第三阶段主要是前台设计的修改完善,以及数据库成功连接,完成小部分功能 情况:前台界面完善,完成小部分功能(发布功能 ...

  10. vs2010调试-尝试调试dll源码。

    第一步: 打开“调试”——“选项和设置”——点击调试下“常规”——设置启用“启用.NET Framework源代码单步执行 ” 第二步 选择“符号”——选择Microsoft符号服务器——设置符号缓存 ...