BZOJ5465 : [APIO 2018] 选圆圈
假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆。
在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\log R)$次,且每个圆最多被检查常数次。
时间复杂度$O(n\log n\log R)$,利用Hash可以做到$O(n\log R)$。
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=300010,inf=1000000000,BUF=13000000;
int n,m,i,x,y,q[N],ans[N],size;char Buf[BUF],*buf=Buf;
struct E{int x,y,r;E(){}E(int _x,int _y,int _r){x=_x,y=_y,r=_r;}}e[N],f[N];
vector<int>g[N],tmp;
inline void read(int&a){int f=0;for(a=0;*buf<45;buf++);if(*buf==45)f=1,buf++;while(*buf>47)a=a*10+*buf++-48;if(f)a=-a;}
inline bool cmp(int x,int y){
if(e[x].r!=e[y].r)return e[x].r>e[y].r;
return x<y;
}
inline bool cmpe(const E&a,const E&b){
if(a.x!=b.x)return a.x<b.x;
return a.y<b.y;
}
inline void init(int _){
if(size&&size/2<_)return;
size=_;
int i,j,k,cnt;
m=0;
for(i=1;i<=n;i++)if(!ans[i]){
int x=e[i].x/size,y=e[i].y/size;
f[++m]=E(x,y,i);
}
sort(f+1,f+m+1,cmpe);
cnt=0;
for(i=1;i<=m;i=j){
for(j=i;j<=m&&f[i].x==f[j].x&&f[i].y==f[j].y;j++);
f[++cnt]=f[i];
g[cnt].clear();
for(k=i;k<j;k++)g[cnt].push_back(f[k].r);
}
m=cnt;
}
inline int ask(int x,int y){
int l=1,r=m,mid;
while(l<=r){
mid=(l+r)>>1;
if(f[mid].x==x&&f[mid].y==y)return mid;
if(f[mid].x<x||f[mid].x==x&&f[mid].y<y)l=mid+1;else r=mid-1;
}
return 0;
}
inline bool check(int i,int j){return 1LL*(e[i].r+e[j].r)*(e[i].r+e[j].r)>=1LL*(e[i].x-e[j].x)*(e[i].x-e[j].x)+1LL*(e[i].y-e[j].y)*(e[i].y-e[j].y);}
inline void apply(int S){
if(ans[S])return;
init(e[S].r*2);
int x=e[S].x/size,y=e[S].y/size,i,j,k,o,t;
for(i=x-1;i<=x+1;i++)for(j=y-1;j<=y+1;j++)if(i>=0&&j>=0){
o=ask(i,j);
if(!o||!g[o].size())continue;
tmp.clear();
for(k=0;k<g[o].size();k++){
t=g[o][k];
if(check(S,t))ans[t]=S;else tmp.push_back(t);
}
swap(g[o],tmp);
}
}
int main(){
fread(Buf,1,BUF,stdin);read(n);
for(i=1;i<=n;i++){
read(x),read(y),read(e[i].r);
e[i].x=x+inf;
e[i].y=y+inf;
q[i]=i;
}
sort(q+1,q+n+1,cmp);
for(i=1;i<=n;i++)apply(q[i]);
for(i=1;i<=n;i++)printf("%d%c",ans[i],i<n?' ':'\n');
return 0;
}
BZOJ5465 : [APIO 2018] 选圆圈的更多相关文章
- BZOJ5465: [APIO 2018] 选圆圈(K-D Tree)
题意 题目链接 Sol 下面是错误做法,正解请看这里 考虑直接用K-D tree模拟.. 刚开始想的是维护矩形最大最小值,以及子树中最大圆的位置,然后... 实际上最大圆的位置是不用维护的,直接把原序 ...
- APIO 2018选圆圈
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #i ...
- 「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)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出 ...
- BZOJ5465 APIO2018选圆圈(KD-Tree+堆)
考虑乱搞,用矩形框圆放KD-Tree上,如果当前删除的圆和矩形有交就递归下去删.为防止被卡,将坐标系旋转一定角度即可.注意eps稍微设大一点,最好开上long double. #include< ...
- [BZOJ5465][APIO2018]选圆圈(KD-Tree)
题意:给你n个圆,每次选择半径最大的,将它和与它相交的圆全部删去,输出每个圆是在哪次被删的. KD树模板题.用一个矩形框住这个圆,就可以直接剪枝了.为了防止被卡可以将点旋转一个角度,为了保险还可以多转 ...
- WC 2018/CTSC 2018/APIO 2018 游记
(要写CTSC的时候才想起来没写WC2018,那就粗略回顾一下吧hhhhh) WC 2018(简略版): 大概和 一个宁夏和一个天津的大哥一个宿舍hhhh,字典序分宿舍真是奇妙. WC讲课真的不是人听 ...
随机推荐
- Coursera, Big Data 4, Machine Learning With Big Data (week 3/4/5)
week 3 Classification KNN :基本思想是 input value 类似,就可能是同一类的 Decision Tree Naive Bayes Week 4 Evaluating ...
- 微信最新跳转浏览器功能源码,实现微信内跳转手机浏览器访问网页url
微信最新自动跳转外部浏览器下载app/打开指定页面源码 源码说明: 适用安卓和苹果系统,支持任何网页链接.并且无论链接是否已经被微信拦截,均可实现微信内自动跳转浏览器打开. 生成的跳转链接具有极佳的防 ...
- LOJ #6509. 「雅礼集训 2018 Day7」C
神仙题 LOJ #6509 题意 给定一棵树,点权为0/1,每次随机一个点(可能和之前所在点相同)走到该点并将其点权异或上1 求期望的移动距离使得所有点点权相同 题解 根本不会解方程 容易发现如果一个 ...
- I\O操作
作用:读写设备上数据.硬盘文件.内存.键盘.网络等. 分类: 数据走向:输入流.输出流 数据类型:字符流(文本数据Reader或者Writer结尾) 字节流(所有类型Stream结尾) 1个字节 = ...
- 004 使用scrapy框架爬虫
0. 建立housePro的scrapy爬虫框架 # 1. 在终端输入,建立housePro项目scrapy startproject housePro# 2. 进入houseProcd houseP ...
- 最小生成树--克鲁斯卡尔算法(Kruskal)
按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...
- TypeScript 错误property does not exist on type Object
TypeScript 错误property does not exist on type Object 在TypeScript中如果按JS的方式去获取对象属性,有时会提示形如Property 'val ...
- 机器学习基石12-Nonlinear Transformation
注: 文章中所有的图片均来自台湾大学林轩田<机器学习基石>课程. 笔记原作者:红色石头 微信公众号:AI有道 上一节课介绍了分类问题的三种线性模型,可以用来解决binary classif ...
- nb-iot简介【转】
转自:http://www.elecfans.com/tags/nb-iot/ 标签 > nb-iot nb-iot 关注 118人关注 提供NB-IoT技术特点,NB-IoT模块/芯片,NB- ...
- Http协议入门、响应与请求行、HttpServletRequest对象的使用、请求参数获取和编码问题
1 课程回顾 web入门 1)web服务软件作用: 把本地资源共享给外部访问 2)tomcat服务器基本操作 : 启动: %tomcat%/bin/startup.bat 关闭: %tomcat%/ ...