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分的好成绩 ...
随机推荐
- Redis Cluster 4.0高可用集群安装、在线迁移操作记录
之前介绍了redis cluster的结构及高可用集群部署过程,今天这里简单说下redis集群的迁移.由于之前的redis cluster集群环境部署的服务器性能有限,需要迁移到高配置的服务器上.考虑 ...
- Redis 多个数据库
注意:Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念. Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存 ...
- STL 的 vector 根据元素的值来删除元素的方法
vector 的 erase( ) 只能删除迭代器,所以要想删某种值的元素,需要这样: 假设有一个 vector 叫 vt ,则 vt.erase( remove( vt.begin() , vt.e ...
- Eclipse提交代码到Spark集群上运行
Spark集群master节点: 192.168.168.200 Eclipse运行windows主机: 192.168.168.100 场景: 为了测试在Eclipse上开发的代码在Spa ...
- DEVC++ C++ Builder6.0
Devc++安装后无法正常编译程序 出现错误,不知道是什么,可能是不兼容的原因 然后就是一直编译出错,程序是最简单的helloworld程序. 之后选择安装C++ Builder 6.0
- js跨域调用mvc ActionResult扩展
背景 最近2个项目中都用到了js跨域访问的知识,2个项目都需要主站与各个分站之间进行数据交互.状态同步等相关操作.浏览器本身是不允许进行跨域访问,在MVC中我们可以扩展一个方法来实现这个功能.在此大家 ...
- 为IE内核的WebBrowser控件内存泄漏所烦恼的可以考虑用Cefsharp代替它!
为IE内核的WebBrowser控件内存泄漏所烦恼的朋友们,可以考虑用Cefsharp代替WebBrowser控件 特意做了一个程序来测试 利用Cefsharp做控件,访问网站.每分钟刷新2次,初始时 ...
- 测试教程网.unittest教程.5. 实例: 找出所有是弱密码的用户
From: http://www.testclass.net/pyunit/test_example_3/ 背景 当我们的测试数据是下面这些的时候,我们的用例是有问题的. [ {"name& ...
- 【Nginx】之安装使用和配置SSL支持
本文采用的是nginx源码安装 1.下载nginx源码包 wget http://nginx.org/download/nginx-1.8.0.tar 或者登录nginx官网下载更高版本 2.ngin ...
- Tomacat 配置
server.xml文件中元素: 1.<Service name="Catalina"> 这个元素相当于IIS的一个网站.该元素可有多个.每个元素会根据名字在conf文 ...