博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
APIO 2018选圆圈
阅读量:4703 次
发布时间:2019-06-10

本文共 2450 字,大约阅读时间需要 8 分钟。

#include
#include
#include
#include
#include
#include
#define sqr(x) (x) * (x)#define M 300005using namespace std;const double inf = 1e20, eps = 1e-3, alpha = acos(-1) / 5, cosa = cos(alpha), sina = sin(alpha);int n, root, ans[M], D,lc[M], rc[M], id[M];double maxx[M][2], minn[M][2], deed[M][2], rn[M];int read() { int nm = 0, f =1; char c = getchar(); for(; !isdigit(c); c = getchar()) if(c == '-') f = -1; for(; isdigit(c); c = getchar()) nm = nm * 10 + c - '0'; return nm * f;}struct C { double d[2], 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 = 0; i <= 1; 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 0; int mid = (l + r) >> 1; D = kx; nth_element(note + l, note + mid, note + r + 1); deed[mid][0] = note[mid][0], deed[mid][1] = note[mid][1]; id[mid] = note[mid].id; rn[mid] = note[mid].r; lc[mid] = build(l, mid - 1, kx ^ 1), rc[mid] = build(mid + 1, r, kx ^ 1); updata(mid); return mid;}bool check(int x, C a){ double xn = deed[x][0], yn = deed[x][1], xnn = a[0], ynn = a[1], 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[0], yn = a[1], r = a.r + a.r; // 位被选中的圆形大小一定比当前小 依据这个来剪枝 if(xn + r + eps < minn[x][0]) return true; if(yn + r + eps < minn[x][1]) return true; if(xn - r - eps > maxx[x][0]) return true; if(yn - r - eps > maxx[x][1]) return true; return false;}void modify(int x, C a) { if(x == 0) 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[0][1] = maxx[0][0] = -inf; minn[0][1] = minn[0][0] = inf; n = read(); for(int i = 1; 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(1, n, 0); sort(note + 1, note + n + 1, cmp); for(int i = 1; i <= n; i++) if(!ans[note[i].id]) modify(root, note[i]); for(int i = 1; i <= n; i++) printf("%d ", ans[i]); return 0;}

 

转载于:https://www.cnblogs.com/luoyibujue/p/9248779.html

你可能感兴趣的文章
AJAX--Jquery
查看>>
模拟新浪微博随便看看
查看>>
环境搭建
查看>>
解密EXL
查看>>
简易版cnlog
查看>>
erlang程序运行的几种方式
查看>>
堆heap和栈Stack(百科)
查看>>
html5页面实现点击复制功能
查看>>
633. 寻找重复的数
查看>>
沉淀,再出发:python中的pandas包
查看>>
Rule 12: Remove Duplicate Scripts(Chapter 12 of High performance Web Sites)
查看>>
缓存服务的更新策略有哪些?
查看>>
php, nginx高并发优化
查看>>
python内置魔法方法
查看>>
Python自学DAY03
查看>>
兴趣问题清单
查看>>
力扣——N叉树的后序遍历
查看>>
C++ namespace命名空间
查看>>
用Hadoop构建电影推荐系统
查看>>
automake连载---关于两个文件configure.in和Makefile.am的编写
查看>>