「APIO2018」选圆圈
传送门
Description
有\(n\)个圆,每次找到这些圆中半径最大中的编号最小的圆,删除ta及与其有交集的所有圆。
对于每个圆,求出它是被哪一个圆删除的。
Solution
K-D Tree
每个点表示这个圆的外接矩形
排序后直接暴力搜索
相当于在搜索过程中进行了剪枝
复杂度玄学
要对全图坐标进行旋转
这题的\(eps\)不要开得太大,\(1e-3\)就行了,不然会莫名的Wa
Code
#include<bits/stdc++.h>
#define ll long long
#define db double
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define reg register
inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
const int MN=3e5+5;
const db eps=1e-3,thi=acos(-1.)/5.,inf=1e12;
int N,D;
db sq(db x){return x*x;}
struct Point
{
db d[2],mx[2],mn[2];int R,l,r,id;
db& operator[](int x){return d[x];}
bool operator<(const Point&x)const{return d[D]<x.d[D];}
}a[MN];
bool cmp(Point x,Point y){return x.R>y.R||(x.R==y.R&&x.id<y.id);}
int rt,ans[MN];
struct K_D_Tree{
Point p[MN],T;
void up(int x)
{
int l=p[x].l,r=p[x].r;
for(int i=0;i<2;++i)
{
if(l) p[x].mn[i]=min(p[x].mn[i],p[l].mn[i]),
p[x].mx[i]=max(p[x].mx[i],p[l].mx[i]);
if(r) p[x].mn[i]=min(p[x].mn[i],p[r].mn[i]),
p[x].mx[i]=max(p[x].mx[i],p[r].mx[i]);
}
}
int build(int l,int r,int th)
{
if(l>r) return 0;
reg int mid=(l+r)>>1;D=th;
std::nth_element(a+l,a+mid,a+r+1);p[mid]=a[mid];
for(reg int i=0;i<2;++i) p[mid].mx[i]=a[mid][i]+a[mid].R,p[mid].mn[i]=a[mid][i]-a[mid].R;
p[mid].l=build(l,mid-1,th^1);p[mid].r=build(mid+1,r,th^1);up(mid);
return mid;
}
void query(int x)
{
for(int i=0;i<2;++i) if(T[i]-T.R>p[x].mx[i]||T[i]+T.R<p[x].mn[i]) return;
if(!ans[p[x].id])
{
db dis=sq(T.R+p[x].R),res=0.;
for(int i=0;i<2;++i) res+=sq(p[x][i]-T[i]);
if(res-dis<eps) ans[p[x].id]=T.id;
}
if(p[x].l)query(p[x].l);if(p[x].r)query(p[x].r);
}
}kdtree;
int main()
{
N=read();
reg int i,x,y;
for(i=1;i<=N;++i)
{
x=read(),y=read();
a[i][1]=(db)x*sin(thi)+(db)y*cos(thi);a[i][0]=(db)x*cos(thi)-(db)y*sin(thi);
a[i].R=read();a[i].id=i;
}
rt=kdtree.build(1,N,0);
std::sort(a+1,a+N+1,cmp);
for(i=1;i<=N;++i)if(!ans[a[i].id])
kdtree.T=a[i],kdtree.query(rt);
for(i=1;i<=N;++i) printf("%d ",ans[i]);
return 0;
}
Blog来自PaperCloud,未经允许,请勿转载,TKS!
「APIO2018」选圆圈的更多相关文章
- LOJ 2586 「APIO2018」选圆圈——KD树
题目:https://loj.ac/problem/2586 只会 19 分的暴力. y 都相等,仍然按直径从大到小做.如果当前圆没有被删除,那么用线段树把 [ x-r , x+r ] 都打上它的标记 ...
- 【LOJ】#2586. 「APIO2018」选圆圈
题解 不旋转坐标系,TLE,旋转坐标系,最慢一个点0.5s--maya,出题人数据水平很高了-- 好吧,如果你不旋转坐标系,写一个正确性和复杂度未知的K - D树,没有优化,你可以得到87分的好成绩 ...
- LOJ #2585. 「APIO2018」新家
#2585. 「APIO2018」新家 https://loj.ac/problem/2585 分析: 线段树+二分. 首先看怎样数颜色,正常的时候,离线扫一遍右端点,每次只记录最右边的点,然后查询左 ...
- LibreOJ2095 - 「CQOI2015」选数
Portal Description 给出\(n,k,L,R(\leq10^9)\),求从\([L,R]\)中选出\(n\)个可相同有顺序的数使得其gcd为\(k\)的方案数. Solution 记\ ...
- 「CQOI2015」选数
「CQOI2015」选数 题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都 ...
- 【APIO2018】选圆圈(平面分块 | CDQ分治 | KDT)
Description 给定平面上的 \(n\) 个圆,用三个参数 \((x, y, R)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出 ...
- 「LuoguP2170」 选学霸(01背包
Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同学们抗议, ...
- 【LOJ2586】【APIO2018】选圆圈 CDQ分治 扫描线 平衡树
题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1,c_2,\ldots,c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \ ...
- LOJ #2587「APIO2018」铁人两项
是不是$ vector$存图非常慢啊...... 题意:求数对$(x,y,z)$的数量使得存在一条$x$到$z$的路径上经过$y$,要求$x,y,z$两两不同 LOJ #2587 $ Solutio ...
随机推荐
- JAVA字符串比较,BigDecimal比较
import java.math.BigDecimal; public class StrCompareTo { public static void main(String[] args) { Sy ...
- DNS原理及劫持问题
对于互联网,人们总是高谈阔论,却很少有人愿意去了解电脑.手机.电视这些设备到底是如何被“连接”起来的.本文通过“我”,一个普通的网络请求的视角,给大家介绍下“我”的工作流程是如何的. 人们动动手指,点 ...
- Spring源码——IOC控制反转
1.基础知识 Spring有两个核心功能,分别是ioc和aop,其中ioc是控制反转,aop是切面编程. 在ioc中,还有一个名次叫DI,也就是依赖注入.嗯,好像IOC和DI是指同一个,好像又感觉他俩 ...
- 内部属性[[class]]
1. 对象的[[class]]属性 所有typeof返回值为“object”的对象(如数组)都包含一个内部属性[[class]],这个属性无法直接访问,一般通过Object.prototype.toS ...
- 学习笔记之盘一盘 Python 系列 1 & 2 - 入门篇
盘一盘 Python 系列 1 & 2 - 入门篇 https://mp.weixin.qq.com/s?__biz=MzIzMjY0MjE1MA==&mid=2247486473&a ...
- HANA- SAP S4/HANA BP屏幕增强添加自定义字段(BDT方式)
转载:https://www.cnblogs.com/hhelibeb/p/7412792.html 这里我们可以使用的技术是Business Data Toolset(以下简称BDT). 以下是网络 ...
- java中的参数传递
Java中只有传值调用(值传递),没有传址调用(址传递或者引用传递).所以在java方法中改变参数的值是不会改变原变量的值的,但为什么改变引用变量的属性值却可以呢?请看下面的解答. java中的数据类 ...
- while 格式化输出 运算符 字符编码
流程控制之while循环 条件循环:while,语法如下 while 条件: # 循环体 # 如果条件为真,那么循环体则执行,执行完毕后再次循环,重新判断条件... # 如果条件为假,那么循环体不执行 ...
- Multi-Task Feature Learning for Knowledge Graph Enhanced Recommendation(知识图谱)
知识图谱(Knowledge Graph,KG)可以理解成一个知识库,用来存储实体与实体之间的关系.知识图谱可以为机器学习算法提供更多的信息,帮助模型更好地完成任务. 在推荐算法中融入电影的知识图谱, ...
- 异常错误:在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式
最近做一个蛋疼的东西就是C#调用windows API 来操作一个摄像头,自动处理一些东西.要用到剪切板复制 粘贴功能,即 Clipboard.SetDataObject(filedic, true) ...