#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. linux shell创建目录、遍历子目录

    1.创建目录 代码1: #!/bin/bash#如果没有tmp_dir目录则创建static_dir="/web/fyunw.com/static"if [ ! -d $staic ...

  2. Tomcat设置UTF-8字符

    进入tomat路径 vim  conf/server.xml

  3. RedHat6.5上安装Hadoop单机

    版本号:RedHat6.5   JDK1.8   Hadoop2.7.3 hadoop  说明:从版本2开始加入了Yarn这个资源管理器,Yarn并不需要单独安装.只要在机器上安装了JDK就可以直接安 ...

  4. 【java】break,continue和return区别

    break:适用于switch和loop continue:只适用于loop 两者都可以通过给循环加标签来控制跳出,如下例所示 class BreakDemo { public static void ...

  5. 关于AXI_Quad_SPI的寄存器配置

    关于AXI_Quad_SPI的寄存器配置 1.核初始化配置 首先是: 40:0000_000A 1C:8000_0000 28:0000_0004 2.命令与dummy_data 60:000001E ...

  6. 关于zynq7 中MIO的理解

    关于zynq7 中MIO的理解 Zynq7000有54个MIO,分配在GPIO的Bank0和Bank1,属于PS部分,这些IO与PS直接相连,不需要添加引脚约束,MIO信号对PL部分是不可见的,对MI ...

  7. ionic 监听页面滚动,点击停止滚动

    类似今日头条,页面上有很多card,点击每个card跳转该card的详情页面.这里有一个问题,当我滚动页面时,会先后触发touchstart.touchmove.touchend,但是当touchen ...

  8. ALGO-27_蓝桥杯_算法训练_FBI树(树,递归)

    问题描述 我们可以把由“”和“”组成的字符串分为三类:全“”串称为B串,全“”串称为I串,既含“”又含“”的串则称为F串. FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种.由一个长 ...

  9. java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 解决方案

    使用java生成图片的时候,报了java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 错误. 根据这个类的api说明,在 ...

  10. Hadoop错误集:Could not find the main class: org.apache.hadoop.*

    在搭建Hadoop机群的时候,之前遇见了很多次找不到类的错误,因为对Hadoop了解不深,所以就在网上漫无目的的找解决方案,所以这里总结下我用的方法. 解决办法一: 我之前遇到了找不到 org.apa ...