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

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

考前挣扎

KD树好题!

暴力模拟 通过kd树的结构把子树内的圈圈框起来

然后排个序根据圆心距 <= R1+R2来判断是否有交点

然后随便转个角度就可以保持优越的nlgn啦

卡精度差评 必须写eps差评

//Love and Freedom.#include
#include
#include
#include
#define db long double#define inf 20021225#define ll long long#define mxn 310000#define eps 1e-3using namespace std;struct poi{ db x,y; poi(){} poi(db _x,db _y){x=_x,y=_y;}};struct circle{ db r; poi pos; int id; circle(){} circle(poi _pos,db _r){pos=_pos;r = _r;}}cc[mxn];int ans[mxn];struct node{ int son[2],id; //poi p; db r,mr,mx[2],mn[2],pos[2];};bool flag;bool cmp(circle a,circle b){ if(flag?abs(a.pos.x - b.pos.x)
b.r; return flag?a.pos.x
< 2; c++) { if(l) t[x].mx[c]=max(t[l].mx[c],t[x].mx[c]),t[x].mn[c]=min(t[l].mn[c],t[x].mn[c]); if(r) t[x].mx[c]=max(t[r].mx[c],t[x].mx[c]),t[x].mn[c]=min(t[r].mn[c],t[x].mn[c]); } if(l) t[x].mr=max(t[x].mr,t[l].mr); if(r) t[x].mr=max(t[x].mr,t[r].mr); } void build(int &x,int l,int r,bool w) { flag = w; sort(cc+l,cc+r+1,cmp); int mid = l+r>>1; x = mid; t[x].mr = t[x].r = cc[mid].r; t[x].id = cc[mid].id; for(int c = 0;c < 2;c++) t[x].pos[c] = t[x].mn[c] = t[x].mx[c] = c?cc[mid].pos.y:cc[mid].pos.x; if(l
< 2;c++) { db wz = (c?goal.pos.y:goal.pos.x),tmp; if(wz>=t[x].mn[c] && wz<=t[x].mx[c]) tmp = 0; else tmp = min(abs(t[x].mn[c]-wz),abs(t[x].mx[c]-wz)); ans += tmp*tmp; } return ans; } void query(int x,circle goal,int w) { if(!ans[t[x].id] && del(goal,circle(poi(t[x].pos[0],t[x].pos[1]),t[x].r))) ans[t[x].id] = w; int l = t[x].son[0], r = t[x].son[1]; db d1,d2; if(l) { d1 = check(l,goal); if((t[l].mr+goal.r)*(t[l].mr+goal.r) -d1>= -eps) query(l,goal,w); } if(r) { d2 = check(r,goal); if((t[r].mr+goal.r)*(t[r].mr+goal.r) -d2>= -eps) query(r,goal,w); } }}kd;bool qaq(circle a,circle b){ return abs(a.r-b.r)
b.r;}const db phi = 1.05426;poi rotate(poi a){ return poi(cosl(phi)*a.x-sinl(phi)*a.y,sinl(phi)*a.x+cosl(phi)*a.y);}int main(){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%Lf%Lf%Lf",&cc[i].pos.x,&cc[i].pos.y,&cc[i].r),cc[i].id=i; cc[i].pos = rotate(cc[i].pos); } kd.build(kd.rt,1,n,0); sort(cc+1,cc+n+1,qaq); for(int i=1;i<=n;i++) if(!ans[cc[i].id]) kd.query(kd.rt,cc[i],cc[i].id); for(int i=1;i<=n;i++) printf("%d ",ans[i]); return 0;}

 

转载于:https://www.cnblogs.com/hanyuweining/p/10321874.html

你可能感兴趣的文章
window phone 独立存储空间的操作
查看>>
Mycat的使用 - 04.事务支持
查看>>
linux chown命令
查看>>
solarwinds 快速上手指南
查看>>
生产环境下Redis主备配置(持久化)
查看>>
vSphere ESXI 故障处理大全
查看>>
Android的手机震动
查看>>
Vcenter5.1安装详解
查看>>
ArcGIS Server 10.1发布要素服务时遇到的数据库注册问题总结 (二)
查看>>
CentOS上编译hadoop 2.7
查看>>
nginx反向代理问题解析
查看>>
Java 类属性继承关系
查看>>
[李景山php]每天TP5-20161220|thinkphp5-build.php
查看>>
查询用户权限 dba-role_privs
查看>>
邮件系统高变动职位邮箱如何管理
查看>>
mysql报错Aborted connection 原因和解决思路-官方
查看>>
来自一个程序员的反思
查看>>
安装安卓(Android)x86系统
查看>>
数字图像处理--空间变换
查看>>
2、Libgdx配置你的开发环境(Eclipse,Intellij IDEA,NetBeans)
查看>>