题目

有 \(n\) 个圆$c_1,c_2, \cdots , c_n $,执行如下的操作:

找到剩下的半径最大的圆删除并删除所有和它有交的其他并没有被删除的圆;

求每个圆是被那个圆删除的;

$1 \le n \le 3 \times 10^5 $ ;

描述

  • kdt做法:
    记录每个圆围成的举行作为剪枝,直接模拟删除;

    记得旋转一下,然后eps开1e-3就好;

  • 搬运一下$n  log^2n $做法(orz yww):

    考虑找到和\(c_i\) 相交的半径最大的被自己删除的圆 ;

    这样的圆一定满足互相不相交;

    由于半径比 \(c_i\) 大,所以如果相交一定会和 \(c_i\) 平行坐标轴的四条切线有交;

    所以用扫描线+cdq分治即可;

    //懒得写正解了这是暴力:
    #include<bits/stdc++.h>
    #define eps 1e-3
    #define ld double
    using namespace std;
    const int N=300010;
    const ld sq2=sqrt(2);
    int n,WD,pos[N],bl[N],ls[N],rs[N],tr[N],rt;///
    struct P{ld x,y;};///
    ld mn[N][2],mx[N][2];///
    struct C{P o;ld r,mn[2],mx[2];int id;}c[N];///
    int dcmp(ld x){return fabs(x)<eps?0:x<0?-1:1;}///
    bool cmp(C A,C B){return !dcmp(A.r-B.r)?A.id<B.id:A.r>B.r;}///
    bool cmpD(int A,int B){return !WD?c[A].o.x<c[B].o.x:c[A].o.y<c[B].o.y;}///
    ld len(P A,P B){return (A.x-B.x)*(A.x-B.x)+(A.y-B.y)*(A.y-B.y);}///
    bool judge(C A,C B){return dcmp(len(A.o,B.o)-(A.r+B.r)*(A.r+B.r))<=0;}///
    void rotate(P&A){A=(P){(A.x-A.y)/sq2,(A.x+A.y)/sq2};}///
    char gc(){static char*p1,*p2,s[1000000];if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);return(p1==p2)?EOF:*p1++;
    }///
    int rd(){int x=0,f=1;char C=gc();while(C<'0'||C>'9'){if(C=='-')f=-1;C=gc();}while(C>='0'&&C<='9'){x=x*10+C-'0';C=gc();}return x*f;
    }///
    void build(int&k,int l,int r,int d){WD=d;k=(l+r)>>1;nth_element(tr+l,tr+k,tr+r+1,cmpD);mn[k][0]=c[tr[k]].mn[0];mx[k][0]=c[tr[k]].mx[0];mn[k][1]=c[tr[k]].mn[1];mx[k][1]=c[tr[k]].mx[1];if(l<k){build(ls[k],l,k-1,d^1);for(int i=0;i<2;++i){mn[k][i]=min(mn[k][i],mn[ls[k]][i]);mx[k][i]=max(mx[k][i],mx[ls[k]][i]);}}if(k<r){build(rs[k],k+1,r,d^1);for(int i=0;i<2;++i){mn[k][i]=min(mn[k][i],mn[rs[k]][i]);mx[k][i]=max(mx[k][i],mx[rs[k]][i]);}}
    }///
    bool jud(int x,int y){return !x||mx[x][0]<c[y].mn[0]-eps||mn[x][0]>c[y].mx[0]+eps||mx[x][1]<c[y].mn[1]-eps||mn[x][1]>c[y].mx[1]+eps;}///
    void query(int k,int x){if(!bl[tr[k]]&&judge(c[tr[k]],c[x]))bl[tr[k]]=c[x].id;if(!jud(ls[k],x))query(ls[k],x);if(!jud(rs[k],x))query(rs[k],x);
    }///
    int main(){
    //    freopen("B.in","r",stdin);
    //    freopen("B.out","w",stdout);n=rd();for(int i=1;i<=n;++i){c[i].o.x=rd();c[i].o.y=rd();rotate(c[i].o);c[i].r=rd();c[i].mn[0]=c[i].o.x-c[i].r;c[i].mx[0]=c[i].o.x+c[i].r;c[i].mn[1]=c[i].o.y-c[i].r;c[i].mx[1]=c[i].o.y+c[i].r;c[i].id=tr[i]=i;}///sort(c+1,c+n+1,cmp);for(int i=1;i<=n;++i)pos[c[i].id]=i;build(rt,1,n,0);for(int i=1;i<=n;++i){if(!bl[i])query(rt,i);}for(int i=1;i<=n;++i)printf("%d ",bl[pos[i]]);return 0;//
    }//

转载于:https://www.cnblogs.com/Paul-Guderian/p/10794050.html

【loj2586】【APIO2018】选圆圈相关推荐

  1. LOJ2586 APIO2018 选圆圈

    考前挣扎 KD树好题! 暴力模拟 通过kd树的结构把子树内的圈圈框起来 然后排个序根据圆心距 <= R1+R2来判断是否有交点 然后随便转个角度就可以保持优越的nlgn啦 卡精度差评 必须写ep ...

  2. BZOJ5465 APIO2018选圆圈(KD-Tree+堆)

    考虑乱搞,用矩形框圆放KD-Tree上,如果当前删除的圆和矩形有交就递归下去删.为防止被卡,将坐标系旋转一定角度即可.注意eps稍微设大一点,最好开上long double. #include< ...

  3. 「APIO2018」选圆圈

    传送门 Description 有\(n\)个圆,每次找到这些圆中半径最大中的编号最小的圆,删除ta及与其有交集的所有圆. 对于每个圆,求出它是被哪一个圆删除的. Solution K-D Tree ...

  4. BZOJ5465 : [APIO 2018] 选圆圈

    假设最大的圆半径为$R$,以$2R$为大小将地图划分为一个个格子,那么每个圆只需要检查圆心在附近$9$个格子内部的所有圆. 在当前圆的半径不足$\frac{R}{2}$时重构网格,那么最多重构$O(\ ...

  5. bzoj5465 [APIO 2018] 选圆圈 kd树

    Description 在平面上,有 n 个圆,记为 c_1, c_2, \ldots, c_n .我们尝试对这些圆运行这个算法: 找到这些圆中半径最大的.如果有多个半径最大的圆,选择编号最小的.记为 ...

  6. [总结]2019年9月 OI学习/刷题记录

    从现在开始记录一下每天的学习情况.主力LOJ? 2019/9/5 LibreOJ #2543. 「JXOI2018」排序问题 答案显然是\(\frac{(n+m)!}{Cnt_1!Cnt_2!\cdo ...

  7. HTML知识积累及实践(五) - 表单元素

    html - 表单元素 一.select标签 select 元素可创建单选或多选菜单 注:当提交表单时,浏览器会提交选定的项目,或者收集用逗号分隔的多个选项将其合成一个单独的参数列表,并且在将 < ...

  8. 记一次3dmax入门

    目录 3dmax注册坑 添加Object 展开UV 修改贴图 修改顶点颜色 导出到Unity 添加和修改骨骼 参考资料 3dmax注册坑 科技日新月异,但是工具越来越作 之前使用3dmax,顶多让你安 ...

  9. python字符串换行连接_python入门 python字符串换行显示、字符串太长\连接多行

    #coding:utf-8 #/usr/bin/python """ 2018-11-03 dinghanhua 缩进 换行 """ &qu ...

最新文章

  1. 简洁好用的数据库表结构文档生成工具!
  2. python3-正则表达式基本使用方法(附案例)_python正则表达式
  3. 【渝粤教育】国家开放大学2019年春季 2507学前儿童艺术教育(音乐) 参考试题
  4. 行为类模式(二):命令(Command)
  5. python queue windows_python Queue模块
  6. linux中fork()函数具体解释(原创!!实例解说)
  7. redis 缓存 淘汰
  8. Python将彩色图像转为灰度图像
  9. iOS开发之导航栏(navigationController)透明化
  10. 通过YAJL生成json语句
  11. DSF 洛谷 P1294 高手去散步
  12. 十大自动化软件测试工具
  13. android 软件安全与逆向分析(非虫)读书笔记
  14. IT行业都有哪些职位,初学者(0基础,新人)该如何选择,才能够快速进入这个行业?...
  15. matlab中的rand函数(用于产生随机数)
  16. STM32F1_HAL库用户使用手册UM1850
  17. 世界杯感悟--我的2022卡塔尔世界杯
  18. Prometheus
  19. 基于51单片机的红外循迹模块
  20. 云南龙江特大桥通车 高德地图实现秒级上线

热门文章

  1. 2014年3月阿里巴巴实习生招聘笔试题目-北京站
  2. matlab命令窗口正忙,matlab一直显示正忙怎么解决-解决matlab一直显示busy的方法 - 河东软件园...
  3. 央视为什么要剑指谷歌
  4. 繁华的都市需要我们一颗宁静的心
  5. ThinkPadX200 BIOS设置详解
  6. 【期末总结】计算机图形学
  7. 用开早会提高工作执行力
  8. 奋斗吧,程序员——第三十五章 莫愁前路无知己,天下谁人不识君
  9. AndroidStudio | 模拟器的手机界面缩小分离
  10. Python 学习笔记 字符串的功能与方法