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讲课真的不是人听 ...
随机推荐
- console.log()在IE下不兼容问题解决
样式改的顺风顺水,到了IE果然出了问题(奇怪,我为什么要说‘果然’?),如果在JS文件中写了console.log()方法,样式就会有缺陷,但是打开IE下的开发者工具就没问题(IE这都是什么鬼!!), ...
- jpa Auditor 自动赋值与自定义 @CreatedBy @LastModifiedBy @CreatedDate @LastModifiedDate
在spring jpa audit 中,在字段或者方法上使用注解@CreatedDate.@CreatedBy.@LastModifiedDate.@LastModifiedBy,当进行实体插入或者更 ...
- [NLP] 酒店名归类
目标: 我们内部系统里记录的酒店名字是由很多人输入的,每个人输入的可能不完全一样,比如,‘成都凯宾斯基大酒店’, ‘凯宾斯基酒店’, ‘凯宾斯基’, 我们的初步想法是能不能把大量的记录归类,把很多相似 ...
- Stm32之通用定时器复习
因为毕业设计要用到PWM调光很久都没用到Stm32的定时器,有些内容已经遗忘,为了回顾复习相关内容今天开下通用定时器这一章节的数据手册. 1.时钟 通用定时器一般是TIM2~TIM5,TIM1.TIM ...
- 第一章Java学习(查漏补缺)
第一章主要内容: 1.Java的地位:网络地位 语言地位 需求地位 2.Java的特点:①简单 面向对象 平台无关:软件的运行不因操作系统,处理器的变化而无法运行或出现运行错误. ②多线程 动态 3. ...
- 安装spring tool suite时遇到的问题
首先在Eclipse的市场里没有找到,在官网下载安装包后不能安装,于是找了解决办法,跟安装suite的版本还有关系. 我下的是http://download.springsource.com/rele ...
- VS2015创建ASP.NET应用程序描述
你的 ASP.NET 应用程序 恭喜! 你已创建了一个项目 此应用程序包含: 显示“主页”.“关于”和“联系方式”之间的基本导航的示例页 使用 Bootstrap 进行主题定位 身份验证,如果选择此项 ...
- vs/windows程序找不到入口点cuvidGetDecodeStatus于AppDecGL.exe动态链接库上
解决方法:这个问题的原因是由于使用的英伟达显卡驱动版本不够新,更新显卡驱动即可. 找了一个多月的原因,终于知道起源了.最终问题还是出在了nvcuvid.lib/.dll上面.通过分析vs调试信息可以得 ...
- c#操作Excel模板,替换命名单元格或关键字形成报表
c#操作Excel模板,替换命名单元格或关键字形成报表 http://blog.sina.com.cn/s/blog_45eaa01a0102vqma.html一 建立Excel 模板文件 templ ...
- 使用 eclipse 的常用操作
1.创建项目 https://blog.csdn.net/tsundere_ning/article/details/79587060 2. 常用代码块创建编辑 使得eclipse 相应, 点击右上角 ...