#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#define sqr(x) (x) * (x)
#define M 300005
using namespace std;
const double inf = 1e20, eps = 1e-, alpha = acos(-) / , cosa = cos(alpha), sina = sin(alpha);
int n, root, ans[M], D,lc[M], rc[M], id[M];
double maxx[M][], minn[M][], deed[M][], rn[M];
int read() {
int nm = , f =;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -;
for(; isdigit(c); c = getchar()) nm = nm * + c - '';
return nm * f;
} struct C {
double d[], r;
int id;
bool operator < (C b) const {
return d[D] < b.d[D];
}
double& operator [](int x) {
return d[x];
} } note[M]; bool cmp(C a, C b) {
return a.r == b.r ? a.id < b.id : a.r > b.r;
} void updata(int x) {
for(int i = ; i <= ; i++) {
maxx[x][i] = minn[x][i] = deed[x][i];
maxx[x][i] = max(maxx[x][i], max(maxx[lc[x]][i], maxx[rc[x]][i]));
minn[x][i] = min(minn[x][i], min(minn[lc[x]][i], minn[rc[x]][i]));
}
} int build(int l, int r, int kx) {
if(l > r) return ;
int mid = (l + r) >> ;
D = kx;
nth_element(note + l, note + mid, note + r + );
deed[mid][] = note[mid][], deed[mid][] = note[mid][];
id[mid] = note[mid].id;
rn[mid] = note[mid].r;
lc[mid] = build(l, mid - , kx ^ ), rc[mid] = build(mid + , r, kx ^ );
updata(mid);
return mid;
}
bool check(int x, C a)
{
double xn = deed[x][], yn = deed[x][], xnn = a[], ynn = a[], r1 = rn[x], r2 = a.r; return sqr(xn - xnn) + sqr(yn - ynn) - sqr(r1 + r2)<= eps;
}
bool cut(int x, C a) {
double xn = a[], yn = a[], r = a.r + a.r; // 位被选中的圆形大小一定比当前小 依据这个来剪枝
if(xn + r + eps < minn[x][]) return true;
if(yn + r + eps < minn[x][]) return true;
if(xn - r - eps > maxx[x][]) return true;
if(yn - r - eps > maxx[x][]) return true;
return false;
}
void modify(int x, C a) {
if(x == ) return;
if(cut(x, a)) return;
if(!ans[id[x]] && check(x, a)) ans[id[x]] = a.id;
modify(lc[x], a) ,modify(rc[x], a);
} int main() {
maxx[][] = maxx[][] = -inf;
minn[][] = minn[][] = inf;
n = read();
for(int i = ; i <= n; i++) {
double x = read(), y = read(), z = read();
note[i] = (C) {
x * cosa - y * sina, x * sina + y * cosa, z, i
};
}
root = build(, n, );
sort(note + , note + n + , cmp);
for(int i = ; i <= n; i++)
if(!ans[note[i].id]) modify(root, note[i]);
for(int i = ; i <= n; i++) printf("%d ", ans[i]);
return ;
}

APIO 2018选圆圈的更多相关文章

  1. BZOJ5465 : [APIO 2018] 选圆圈

    假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆. 在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\ ...

  2. BZOJ5465: [APIO 2018] 选圆圈(K-D Tree)

    题意 题目链接 Sol 下面是错误做法,正解请看这里 考虑直接用K-D tree模拟.. 刚开始想的是维护矩形最大最小值,以及子树中最大圆的位置,然后... 实际上最大圆的位置是不用维护的,直接把原序 ...

  3. 「APIO2018选圆圈」

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

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

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

  5. 学习笔记--APIO 2018 二分专题 By wuvin

    前言: 在APIO 2018 Day2下午听wuvin讲二分,听了一上午的神仙,现在终于有可以听懂了. 专题: 平均边权最大 题目链接:https://www.questoj.cn/problem/3 ...

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

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

  7. WC 2018/CTSC 2018/APIO 2018 游记

    (要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...

  8. APIO 2018 游记

    上接CTSC 2018 游记 day1 早上大概八九点起来洗了个澡跑到隔壁寝发现 tj 还在??? 原来昨天晚上听错名字了... 下午一起去 wfj 王府井玩,陪李总逛逛奢侈品店... 走了两三个小时 ...

  9. 【LOJ】#2586. 「APIO2018」选圆圈

    题解 不旋转坐标系,TLE,旋转坐标系,最慢一个点0.5s--maya,出题人数据水平很高了-- 好吧,如果你不旋转坐标系,写一个正确性和复杂度未知的K - D树,没有优化,你可以得到87分的好成绩 ...

随机推荐

  1. es高级部分

    1 关于机器 配置. 内存:上亿的数据一般需要64G内存的服务器.劲量不要使用小于32G 内存的服务器. cpu:es 对cpu 要求依赖不如内存.一般要求2-8 核就可以了. 磁盘:es 对磁盘依赖 ...

  2. Linux基础入门之vsFTP+MySQL/MariaDB认证实现虚拟用户配置详解

    https://www.dwhd.org/20150603_144841.html 摘要 VSFTP可以使用系统账户或者匿名账户登录,但是出于安全的考虑,通常建议使用vsftp虚拟账户来登录ftp服务 ...

  3. py-day1-6 python 5个灰魔法 【len,index索引,for循环,切片】

    # 索引,下标,获取字符串中的某一个字符. test = 'MuMingJun' v = test[3] print(v) i # 切片 test = 'MuMingJun' v = test[0:- ...

  4. iis上的aps.net1.1程序池如何添加

    http://www.jb51.net/article/84668.htm iis上的aps.net1.1 的程序池是默认有的,如果不小心将其删掉,或者改成其他版本,将没办法在iis工具上还原或新建一 ...

  5. 几种always块的形态

    几种always块的形态 1.时钟沿触发与复位触发 2.使能触发 3.预设触发 4.时序寄存器与锁存触发 5.组合逻辑

  6. Centos 使用find查找

    CentOS查找目录或文件 find / -name svn 查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 ...

  7. 源代码安装Apache、Mysql、PHP

    源代码软件的优点:     获得最新版,能及时修复bug:     能自行修改和定制: 源代码打包形式:     .tar.gz和.tar.bz2格式居多: 完整性校验:     md5sum校验工具 ...

  8. 持续集成之Jenkins+Gitlab实现持续集成 [二]

    持续集成之Jenkins+Gitlab实现持续集成 [二] 项目:使用git+jenkins实现持续集成 开始构建  General  源码管理 我们安装的是Git插件,还可以安装svn插件  我们将 ...

  9. 学习java字符串编码总结

    http://blog.csdn.net/wikijava/article/details/5571953 系统不同部分的编码方式转换

  10. Mysql 复制工作原理

    数据库配置的时候,一定要开启二进制日志,如果开始没开启后来再想开启的话,必须重启. 基于日志点的复制 备份数据库工具 ----------------------------------------- ...