Description

给出 \(n\) 个圆 \((x_i,y_i,r_i)\)

每次重复以下步骤:

找出半径最大的圆,并删除与这个圆相交的圆

求出每一个圆是被哪个圆删除的

Solution

\(kd-tree\) 搞一下

维护能够围住所有圆的最小矩形

然后模拟题意,枚举半径最大的圆

查询时就判断询问的圆是否与这个矩形有交,有交就递归下去

#include<bits/stdc++.h>
#define sqr(x) ((x)*(x))
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=3e5+10,inf=2e9+10;const double eps=1e-7;
int n,rt,D,ans[N];
struct data{
double a[2],mn[2],mx[2],R;int l,r,tag,id;
inline double& operator [](int x){return a[x];}
}t[N],c[N],W;
inline bool operator <(data p,data q){return p[D]<q[D];}
inline bool comp(data p,data q){return p.R!=q.R?p.R>q.R:p.id<q.id;}
inline void upd(int o){
int l=t[o].l,r=t[o].r;
for(int i=0;i<2;i++){
t[o].mx[i]=-inf;t[o].mn[i]=inf;
if(!t[o].tag)t[o].mn[i]=min(t[o].mn[i],t[o].a[i]-t[o].R),
t[o].mx[i]=max(t[o].mx[i],t[o].a[i]+t[o].R);
if(l)t[o].mn[i]=min(t[o].mn[i],t[l].mn[i]),
t[o].mx[i]=max(t[o].mx[i],t[l].mx[i]);
if(r)t[o].mn[i]=min(t[o].mn[i],t[r].mn[i]),
t[o].mx[i]=max(t[o].mx[i],t[r].mx[i]);
}
}
inline int build(int l,int r,int k){
int mid=(l+r)>>1,o=mid;D=k;
nth_element(t+l,t+mid,t+r+1);
if(l<mid)t[o].l=build(l,mid-1,k^1);
if(r>mid)t[o].r=build(mid+1,r,k^1);
return upd(o),o;
}
inline void query(int o){
if(!o)return ;
for(int i=0;i<2;i++)
if(W.a[i]-W.R>t[o].mx[i] || W.a[i]+W.R<t[o].mn[i])return ;
if(!t[o].tag){
double dis=0,R=sqr(W.R+t[o].R);
for(int i=0;i<2;i++)dis+=sqr(t[o].a[i]-W.a[i]);
if(dis-R<eps)ans[t[o].id]=W.id,t[o].tag=1;
}
query(t[o].l);query(t[o].r);
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>n;
double x,y,z;
for(int i=1;i<=n;i++){
gi(x);gi(y);gi(z);
t[i].a[0]=c[i].a[0]=x;t[i].a[1]=c[i].a[1]=y;
t[i].R=c[i].R=z;c[i].id=t[i].id=i;
}
rt=build(1,n,0);
sort(c+1,c+n+1,comp);
for(int i=1;i<=n;i++){
if(ans[c[i].id])continue;
W=c[i];
query(rt);
}
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
return 0;
}

[APIO2018] Circle selection 选圆圈的更多相关文章

  1. 【LG4631】[APIO2018]Circle selection 选圆圈

    [LG4631][APIO2018]Circle selection 选圆圈 题面 洛谷 题解 用\(kdt\)乱搞剪枝. 维护每个圆在\(x.y\)轴的坐标范围 相当于维护一个矩形的坐标范围为\([ ...

  2. [APIO2018] Circle selection 选圆圈(假题解)

    题面 自己去\(LOJ\)上找 Sol 直接排序然后\(KDTree\)查询 然后发现\(TLE\)了 然后把点旋转一下,就过了.. # include <bits/stdc++.h> # ...

  3. [Luogu4631][APIO2018] Circle selection 选圆圈

    Luogu 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2,...,c_n\) .我们尝试对这些圆运行这个算法: \(1\).找到这些圆中半径最大的.如果有多个半径最大的圆,选择 ...

  4. luogu P4631 [APIO2018] Circle selection 选圆圈

    传送门 那个当前半径最大的圆可以用堆维护.这道题一个想法就是优化找和当前圆有交的圆的过程.考虑对于所有圆心建KD-tree,然后在树上遍历的找这样的点.只要某个点子树内的点构成的矩形区域到当前圆心的最 ...

  5. 洛谷4631 [APIO2018] Circle selection 选圆圈 (KD树)

    qwq纪念AC450 一开始想这个题想复杂了. 首先,正解的做法是比较麻烦的. qwqq 那么就不如来一点暴力的东西,看到平面上点的距离的题,不难想到\(KD-Tree\) 我们用类似平面最近点对那个 ...

  6. [APIO2018]Circle selection

    https://www.zybuluo.com/ysner/note/1257597 题面 在平面上,有\(n\)个圆,记为\(c_1,c_2,...,c_n\).我们尝试对这些圆运行这个算法: 找到 ...

  7. 【APIO2018】选圆圈(平面分块 | CDQ分治 | KDT)

    Description 给定平面上的 \(n\) 个圆,用三个参数 \((x, y, R)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出 ...

  8. 「APIO2018选圆圈」

    「APIO2018选圆圈」 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2, \ldots, c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径 ...

  9. 【LOJ2586】【APIO2018】选圆圈 CDQ分治 扫描线 平衡树

    题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1,c_2,\ldots,c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \ ...

随机推荐

  1. jsonp的使用记录

    最近前端的同事说要写一个手机查看的html5页面,需要我提供数据. 这个很ok啊,立马写了个服务返回数据.但是对方调用不了,因为跨域了. 返回错误如下:  Failed to load xxxxxx: ...

  2. iOS去除api过期警告提示

    1.问题描述 应用最低支持版本调高,导致部分旧的代码中API出现警告. 2.解决问题 使用以下代码夹住过期的API部分代码即可解决该问题. #pragma clang diagnostic push ...

  3. jquery遍历-filter()

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

  4. nginx处理高并发请求强于apache

    ginx 不同于 Apache2 的一点就是,Nginx 采用单线程,非阻塞,异步 IO 的工作模型. Apache2 对于每一个请求,都会创建一个新进程或线程,会浪费很多内存和 CPU 时间,而 N ...

  5. javap -- Java 类文件解析器

    参考文档 http://blog.chinaunix.net/uid-692788-id-2681132.html http://docs.oracle.com/javase/7/docs/techn ...

  6. Vue---基础笔记 (基础的构建 )

    vue 基础 准备工作 chrome浏览器插件安装 完成后出现标记 vue页面标记需要使用vue.js非vue.min.js 调试页面 结构模型MVVM =  m:model + v:view + v ...

  7. 基本bash shell命令

    以下列举一些常用的bash shell命令,在使用时方便查找. 访问Linux系统上的手册:man 命令.例:man ps      手册是由分页程序来显示的,可以通过点击 空格,回车,向上和向下箭头 ...

  8. 使用ceph-deploy进行ceph安装

    ceph安装包介绍: 1.ceph-deploy: ceph的部署软件,通过该软件可以简便部署,这个软件并非整个ceph集群系统中必须的 2.ceph: ceph整个服务集群中的每个节点必须的软件.提 ...

  9. I01-通过查询资料库方式来监控Informatica调度情况

    --登陆INFA资料库,运行下面的SQL --想要更加个性化查询的话注意看SQL倒数第二第三行的备注 SELECT RUN_DATE, START_TIME , END_TIME, FOLIDER , ...

  10. jvm内存分部

    首先我们必须要知道的是 Java 是跨平台的.java常用的名词有jdk,jre,jvm jdk包括后两者,是开发者工具集, jre表示java运行环境, jvm是java虚拟机,是java夸平台的保 ...