BZOJ5465 APIO2018选圆圈(KD-Tree+堆)】的更多相关文章

考虑乱搞,用矩形框圆放KD-Tree上,如果当前删除的圆和矩形有交就递归下去删.为防止被卡,将坐标系旋转一定角度即可.注意eps稍微设大一点,最好开上long double. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> #include<queue> #…
题意 题目链接 Sol 下面是错误做法,正解请看这里 考虑直接用K-D tree模拟.. 刚开始想的是维护矩形最大最小值,以及子树中最大圆的位置,然后... 实际上最大圆的位置是不用维护的,直接把原序列排一遍序就可以了 再努力卡卡常就过了 如果还过不了的话可以尝试把所有点都转一个角度 // luogu-judger-enable-o2 #include<bits/stdc++.h> #define chmin(x, y) (x = x < y ? x : y) #define chmax…
题意:给你n个圆,每次选择半径最大的,将它和与它相交的圆全部删去,输出每个圆是在哪次被删的. KD树模板题.用一个矩形框住这个圆,就可以直接剪枝了.为了防止被卡可以将点旋转一个角度,为了保险还可以多转几个角度. #include<cmath> #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef double db; using na…
「APIO2018选圆圈」 题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1, c_2, \ldots, c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \(c_i\) . 删除 \(c_i\) 及与其有交集的所有圆.两个圆有交集当且仅当平面上存在一个点,这个点同时在这两个圆的圆周上或圆内. 重复上面两个步骤直到所有的圆都被删除. 当 \(c_i\) 被删除时,若循环中第1步选择的圆是 \(c_j\) ,我们说 \(c…
题目:https://loj.ac/problem/2586 只会 19 分的暴力. y 都相等,仍然按直径从大到小做.如果当前圆没有被删除,那么用线段树把 [ x-r , x+r ] 都打上它的标记. 看当前圆有没有被删除,只要看 x-r 和 x+r 两个位置上的标记就行了.因为被删除的话当前圆的直径更小,有相交的话, x-r 或 x+r 一定在对方内部.可以 x-r 和 x+r 分别在两个圆内部,看看哪个更大即可. #include<cstdio> #include<cstring&…
考前挣扎 KD树好题! 暴力模拟 通过kd树的结构把子树内的圈圈框起来 然后排个序根据圆心距 <= R1+R2来判断是否有交点 然后随便转个角度就可以保持优越的nlgn啦 卡精度差评 必须写eps差评 //Love and Freedom. #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define db long double #define inf 2…
[LG4631][APIO2018]Circle selection 选圆圈 题面 洛谷 题解 用\(kdt\)乱搞剪枝. 维护每个圆在\(x.y\)轴的坐标范围 相当于维护一个矩形的坐标范围为\([x-r,x+r],[y-r,y+r]\) 可以减小搜索范围 然后再判断一下一个圆是否在当前搜索的矩形内,不在就剪枝 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring&g…
Description 给定平面上的 \(n\) 个圆,用三个参数 \((x, y, R)\) 表示圆心坐标和半径. 每次选取最大的一个尚未被删除的圆删除,并同时删除所有与其相切或相交的圆. 最后输出每个圆分别是被那个圆所删除的. Hint \(1\le n\le 3\times 10^5\) \(0\le |x|, |y|, R \le 10^9\) Solution 1 后来在 Codeforces 上找到的官方题解 Link here.如果对题解中某些说明无法理解可以参考上述内容.做法参考…
题目描述 在平面上,有 \(n\) 个圆,记为 \(c_1,c_2,\ldots,c_n\) .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 \(c_i\) . 删除 \(c_i\) 及与其有交集的所有圆.两个圆有交集当且仅当平面上存在一个点,这个点同时在这两个圆的圆周上或圆内.(原文直译:如果平面上存在一个点被这两个圆所包含,我们称这两个圆有交集.一个点被一个圆包含,当且仅当它位于圆内或圆周上.) 重复上面两个步骤直到所有的圆都被删除.…
传送门 Description 有\(n\)个圆,每次找到这些圆中半径最大中的编号最小的圆,删除ta及与其有交集的所有圆. 对于每个圆,求出它是被哪一个圆删除的. Solution  K-D Tree 每个点表示这个圆的外接矩形 排序后直接暴力搜索 相当于在搜索过程中进行了剪枝 复杂度玄学 要对全图坐标进行旋转 这题的\(eps\)不要开得太大,\(1e-3\)就行了,不然会莫名的Wa Code  #include<bits/stdc++.h> #define ll long long #de…