[APIO2018] Circle selection 选圆圈
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 选圆圈的更多相关文章
- 【LG4631】[APIO2018]Circle selection 选圆圈
[LG4631][APIO2018]Circle selection 选圆圈 题面 洛谷 题解 用\(kdt\)乱搞剪枝. 维护每个圆在\(x.y\)轴的坐标范围 相当于维护一个矩形的坐标范围为\([ ...
- [APIO2018] Circle selection 选圆圈(假题解)
题面 自己去\(LOJ\)上找 Sol 直接排序然后\(KDTree\)查询 然后发现\(TLE\)了 然后把点旋转一下,就过了.. # include <bits/stdc++.h> # ...
- [Luogu4631][APIO2018] Circle selection 选圆圈
Luogu 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2,...,c_n\) .我们尝试对这些圆运行这个算法: \(1\).找到这些圆中半径最大的.如果有多个半径最大的圆,选择 ...
- luogu P4631 [APIO2018] Circle selection 选圆圈
传送门 那个当前半径最大的圆可以用堆维护.这道题一个想法就是优化找和当前圆有交的圆的过程.考虑对于所有圆心建KD-tree,然后在树上遍历的找这样的点.只要某个点子树内的点构成的矩形区域到当前圆心的最 ...
- 洛谷4631 [APIO2018] Circle selection 选圆圈 (KD树)
qwq纪念AC450 一开始想这个题想复杂了. 首先,正解的做法是比较麻烦的. qwqq 那么就不如来一点暴力的东西,看到平面上点的距离的题,不难想到\(KD-Tree\) 我们用类似平面最近点对那个 ...
- [APIO2018]Circle selection
https://www.zybuluo.com/ysner/note/1257597 题面 在平面上,有\(n\)个圆,记为\(c_1,c_2,...,c_n\).我们尝试对这些圆运行这个算法: 找到 ...
- 【APIO2018】选圆圈(平面分块 | CDQ分治 | KDT)
Description 给定平面上的 \(n\) 个圆,用三个参数 \((x, y, R)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出 ...
- 「APIO2018选圆圈」
「APIO2018选圆圈」 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2, \ldots, c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径 ...
- 【LOJ2586】【APIO2018】选圆圈 CDQ分治 扫描线 平衡树
题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1,c_2,\ldots,c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \ ...
随机推荐
- Centos 固定ip
vim /etc/sysconfig/network-scripts/ifcfg-eth0 BOOTPROTO="static" ONBOOT=yes IPADDR=192.168 ...
- MongoDB高级知识
MongoDB高级知识 一.mongodb适合场景: 1.读写分离:MongoDB服务采用三节点副本集的高可用架构,三个数据节点位于不同的物理服务器上,自动同步数据.Primary和Secondary ...
- [ActionScript 3.0] 用TextField的方法getCharIndexAtPoint(x:Number, y:Number):int实现文字在固定范围内显示
有时候我们遇到一行文字过多时必须固定文字的显示范围,但由于中英文所占字节数不一样,所以不能很好的用截取字符的方式去统一显示范围的大小,用TextField的getCharIndexAtPoint(x: ...
- python 导入模块与使用
学习python之前一定要了解导入模块是怎么导入的,至少在看代码时不知道能很快的了解别人写的东西是哪里来. Python默认仅安装部分基础或核心模块,启动时也仅加载了基础模块,在需要是再显式的加载其他 ...
- rejected –non-fast-forward解决方法
Eclipse 是一个开放源代码的.基于Java的可扩展开发平台.就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境.幸运的是,Eclipse 附带了一个标准的插件集,包括Java开 ...
- windows10下使用ubuntu,并搭建nodejs环境
1.首先要在win10的设置里打开开发人员使用模式 2.在bash下,下载ubuntu系统 3.安装git,因为要把下载nvm的话,需要git sudo apt-get install git 4.安 ...
- TX 下常用的查询指令
查看Jetson TX2 L4T版本 head -n 1 /etc/nv_tegra_release 查看系统版本 cat /etc/lsb-release 查看系统l内核 uname -a 查看内存 ...
- BZOJ1688 Disease Manangement 疾病管理
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D ...
- [Java]去除html中的标签或者元素属性(正则表达式)
后台的数据库中某个字段是富文本框输入的 带有Html的标签 ,去掉标签后返回给前台 1.去掉Html 标签的代码 //过滤html标签 Pattern p_html = Pattern.compile ...
- MODBUS协议相关代码(CRC验证 客户端程序)
Modbus协议是一种已广泛应用于当今工业控制领域的通用通讯协议.通过此协议,控制器相互之间.或控制器经由网络(如以太网)可以和其它设备之间进行通信.Modbus协议使用的是主从通讯技术,即由主设备主 ...