APIO 2018选圆圈
#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选圆圈的更多相关文章
- BZOJ5465 : [APIO 2018] 选圆圈
假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆. 在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\ ...
- BZOJ5465: [APIO 2018] 选圆圈(K-D Tree)
题意 题目链接 Sol 下面是错误做法,正解请看这里 考虑直接用K-D tree模拟.. 刚开始想的是维护矩形最大最小值,以及子树中最大圆的位置,然后... 实际上最大圆的位置是不用维护的,直接把原序 ...
- 「APIO2018选圆圈」
「APIO2018选圆圈」 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2, \ldots, c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径 ...
- 【LG4631】[APIO2018]Circle selection 选圆圈
[LG4631][APIO2018]Circle selection 选圆圈 题面 洛谷 题解 用\(kdt\)乱搞剪枝. 维护每个圆在\(x.y\)轴的坐标范围 相当于维护一个矩形的坐标范围为\([ ...
- 学习笔记--APIO 2018 二分专题 By wuvin
前言: 在APIO 2018 Day2下午听wuvin讲二分,听了一上午的神仙,现在终于有可以听懂了. 专题: 平均边权最大 题目链接:https://www.questoj.cn/problem/3 ...
- 【APIO2018】选圆圈(平面分块 | CDQ分治 | KDT)
Description 给定平面上的 \(n\) 个圆,用三个参数 \((x, y, R)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出 ...
- WC 2018/CTSC 2018/APIO 2018 游记
(要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...
- APIO 2018 游记
上接CTSC 2018 游记 day1 早上大概八九点起来洗了个澡跑到隔壁寝发现 tj 还在??? 原来昨天晚上听错名字了... 下午一起去 wfj 王府井玩,陪李总逛逛奢侈品店... 走了两三个小时 ...
- 【LOJ】#2586. 「APIO2018」选圆圈
题解 不旋转坐标系,TLE,旋转坐标系,最慢一个点0.5s--maya,出题人数据水平很高了-- 好吧,如果你不旋转坐标系,写一个正确性和复杂度未知的K - D树,没有优化,你可以得到87分的好成绩 ...
随机推荐
- 读DataSnap源代码(一)
Delphi的DataSnap用了一段时间了,但一直感觉有些地方还不够了解,所以花时间阅读了源代码,特作此烂笔头. Datasnap是在之前的WebBorker基础上搭建的,DataSnap向导自动生 ...
- Linux下nohup日志输出过大问题解决方案
转载自:http://blog.csdn.net/shawnhu007/article/details/50971084 最近在一hadoop测试集群运行一个spark streaming程序,然后使 ...
- CodeReview常见代码问题
路线图 常见代码问题空值未捕获潜在的异常低性能影响范围过大单测问题与原有业务逻辑不兼容缺乏必要日志错误码不符合规范参数检测缺乏或不足引用错误细节错误多重条件文不符实跨语言或跨系统交互可维护性问题硬编码 ...
- php Pthread 多线程基本介绍
我们可以通过安装Pthread扩展来让PHP支持多线程. 线程,有时称为轻量级进程,是程序执行的最小单元.线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,它与同属 ...
- MS Batch AI
微软的Batch AI服务是一项新服务,它可以帮助你在GPU pool上训练和测试机器学习模型,包括深度学习模型.它简化了在当前许多流行的深度学习框架(如TensorFlow.Microsoft认知工 ...
- TStrings (TStringList)很有功能
用 TStrings的Object 保存类的方式,来保存除了Items以外的值. 今天才发现,原来,TStrings下,还有 Items,Values,Items.Names,Items.Values ...
- Thinkphp 关联模型
1.定义关联模型 2.使用关联模型 D('BlogRelation')->relation(true)->add($data);
- java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 解决方案
使用java生成图片的时候,报了java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 错误. 根据这个类的api说明,在 ...
- Hadoop概念学习系列之为什么hadoop/spark执行作业时,输出路径必须要不存在?(三十九)
很多人只会,但没深入体会和想为什么要这样? 拿Hadoop来说,当然,spark也一样的道理. 输出路径由Hadoop自己创建,实际的结果文件遵守part-nnnn的约定. 如何指定一个已有目录作为H ...
- javac命令和java命令
要知道java是分两部分的:一个是编译,一个是运行. javac:负责的是编译的部分,当执行javac时,会启动java的编译器程序.对指定扩展名的.java文件进行编译. 生成了jvm可以识别的字节 ...