题目描述

在Byteland的首都,有一个矩形围栏围起来的公园。在这个公园里树和访客都以一个圆形表示。公园有四个出入口,每个角落一个(1=左下角,2=右下角,3=右上角,4=左上角)。访客能通过这些出入口进出公园。访客在同时碰到一个角落的两条边时就可以通过该角落进出公园。访客在公园里可以自由地移动,但他们不能和树和围栏相交。对于每个访客,给定他们进入公园的出入口,你的任务是计算他们能在哪个出入口离开公园。

输入

输入的第一行包含两个整数:n,m:树的数量和访客的数量。
第二行包含两个整数:w,h:公园的宽和高。左下角的坐标是(0,0),右上角的坐标是(w,h)。
接下来的n行描述每棵树。
每行包含3个整数:x,y,r:树的圆心是(x,y),半径是r。每棵树都不会和其他树和围栏相交。
最后m行描述每个访客。每行包含2个整数:r,e:访客的半径和他们进入公园的出入口。
数据保证没有一棵树会和每个角落的2k*2k的方形区域相交,k是最大的访客半径。
1<=N<=2000
1<=M<=100000
4k<w,h<=10^9

输出

对于每个访客你要输出一行,包含了他们能在哪些出入口离开公园,以从小到大的顺序输出,不需要空格分隔。

样例输入

5 3
16 11
11 8 1
6 10 1
7 3 2
10 4 1
15 5 1
1 1
2 2
2 1

样例输出

1234
2
14


题解

离线+对偶图+并查集

套路:如果两棵树或树与边界之间无法通过,则视作它们之间连了一条边。

那么左下角能到右下角等价于:下边界与左、上、右边界都不连通。其余同理。

然而每个人的半径都不同,对每个人单独处理必T无疑。考虑离线,将人按照半径、树与树和树与边界按照能通过的最大距离从小到大排序然后处理即可。

连通性可以直接使用并查集维护。

时间复杂度 $O(n^2\log n+m\log m+m\times 常数)$

  1. #include <cmath>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #define squ(x) (x) * (x)
  5. using namespace std;
  6. struct data
  7. {
  8. double d;
  9. int x , y;
  10. data() {}
  11. data(double a , int b , int c) {d = a , x = b , y = c;}
  12. bool operator<(const data &a)const {return d < a.d;}
  13. }a[2007010] , q[100010];
  14. double px[2010] , py[2010] , pr[2010];
  15. int f[2010] , ans[100010] , tot;
  16. int find(int x)
  17. {
  18. return x == f[x] ? x : f[x] = find(f[x]);
  19. }
  20. int main()
  21. {
  22. int n , m , i , j , p = 1 , t1 , t2 , t3 , t4;
  23. double w , h;
  24. scanf("%d%d%lf%lf" , &n , &m , &w , &h);
  25. for(i = 1 ; i <= n ; i ++ )
  26. {
  27. scanf("%lf%lf%lf" , &px[i] , &py[i] , &pr[i]);
  28. a[++tot] = data(px[i] - pr[i] , i , n + 1);
  29. a[++tot] = data(py[i] - pr[i] , i , n + 2);
  30. a[++tot] = data(w - px[i] - pr[i] , i , n + 3);
  31. a[++tot] = data(h - py[i] - pr[i] , i , n + 4);
  32. for(j = 1 ; j < i ; j ++ ) a[++tot] = data(sqrt(squ(px[i] - px[j]) + squ(py[i] - py[j])) - pr[i] - pr[j] , i , j);
  33. }
  34. for(i = 1 ; i <= m ; i ++ ) scanf("%lf%d" , &q[i].d , &q[i].x) , q[i].d *= 2 , q[i].y = i;
  35. sort(a + 1 , a + tot + 1) , sort(q + 1 , q + m + 1);
  36. for(i = 1 ; i <= n + 4 ; i ++ ) f[i] = i;
  37. for(i = 1 ; i <= m ; i ++ )
  38. {
  39. while(p <= tot && a[p].d < q[i].d) f[find(a[p].x)] = find(a[p].y) , p ++ ;
  40. t1 = find(n + 1);
  41. t2 = find(n + 2);
  42. t3 = find(n + 3);
  43. t4 = find(n + 4);
  44. if(q[i].x == 1)
  45. {
  46. ans[q[i].y] |= (1 << 1);
  47. if(t2 != t1 && t2 != t3 && t2 != t4) ans[q[i].y] |= (1 << 2);
  48. if(t1 != t2 && t1 != t3 && t2 != t4 && t3 != t4) ans[q[i].y] |= (1 << 3);
  49. if(t1 != t2 && t1 != t3 && t1 != t4) ans[q[i].y] |= (1 << 4);
  50. }
  51. else if(q[i].x == 2)
  52. {
  53. ans[q[i].y] |= (1 << 2);
  54. if(t2 != t1 && t2 != t3 && t2 != t4) ans[q[i].y] |= (1 << 1);
  55. if(t3 != t1 && t3 != t2 && t3 != t4) ans[q[i].y] |= (1 << 3);
  56. if(t1 != t3 && t1 != t4 && t2 != t3 && t2 != t4) ans[q[i].y] |= (1 << 4);
  57. }
  58. else if(q[i].x == 3)
  59. {
  60. ans[q[i].y] |= (1 << 3);
  61. if(t1 != t2 && t1 != t3 && t2 != t4 && t3 != t4) ans[q[i].y] |= (1 << 1);
  62. if(t3 != t1 && t3 != t2 && t3 != t4) ans[q[i].y] |= (1 << 2);
  63. if(t4 != t1 && t4 != t2 && t4 != t3) ans[q[i].y] |= (1 << 4);
  64. }
  65. else
  66. {
  67. ans[q[i].y] |= (1 << 4);
  68. if(t1 != t2 && t1 != t3 && t1 != t4) ans[q[i].y] |= (1 << 1);
  69. if(t1 != t3 && t1 != t4 && t2 != t3 && t2 != t4) ans[q[i].y] |= (1 << 2);
  70. if(t4 != t1 && t4 != t2 && t4 != t3) ans[q[i].y] |= (1 << 3);
  71. }
  72. }
  73. for(i = 1 ; i <= m ; i ++ )
  74. {
  75. for(j = 1 ; j <= 4 ; j ++ )
  76. if(ans[i] & (1 << j))
  77. printf("%d" , j);
  78. puts("");
  79. }
  80. return 0;
  81. }

【bzoj5183】[Baltic2016]Park 离线+对偶图+并查集的更多相关文章

  1. 【bzoj3007】拯救小云公主 二分+对偶图+并查集

    题目描述 英雄又即将踏上拯救公主的道路…… 这次的拯救目标是——爱和正义的小云公主. 英雄来到boss的洞穴门口,他一下子就懵了,因为面前不只是一只boss,而是上千只boss.当英雄意识到自己还是等 ...

  2. bzoj5183 [Baltic2016]Park

    题目描述: bz luogu 题解: 把坐标系看反了持续$WA$系列. 对偶图+并查集维护. 先处理出树对树.树对墙的空隙,然后把人和空隙按从小到大排序. 用并查集维护四面墙之间是否能互相隔断. 代码 ...

  3. BZOJ_4423_[AMPPZ2013]Bytehattan_对偶图+并查集

    BZOJ_4423_[AMPPZ2013]Bytehattan_对偶图+并查集 Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的. 有k次操作,每次会删掉图中的 ...

  4. 【BZOJ4423】[AMPPZ2013]Bytehattan 对偶图+并查集

    [BZOJ4423][AMPPZ2013]Bytehattan Description 比特哈顿镇有n*n个格点,形成了一个网格图.一开始整张图是完整的.有k次操作,每次会删掉图中的一条边(u,v), ...

  5. 【bzoj4423】[AMPPZ2013]Bytehattan(平面图转对偶图+并查集)

    题目传送门:bzoj4423 如果是普通的删边判连通性,我们可以很显然的想到把操作离线下来,倒着加边.然而,这题强 制 在 线. 虽然如此,但是题目所给的图是个平面图.那么我们把它转成对偶图试试看? ...

  6. HDU 5441 离线处理 + 并查集

    题意:给n个节点m条带权值边的无向图.然后q个问题,每次询问点对的数目,点对需要满足的条件是:1)连通:2)其路径的最大权值不能超过询问值. 分析:如果没次询问一次,dfs一次,很可能超时,因此可以用 ...

  7. 对偶图 并查集 BZOJ4423

    题目链接 题目因为要根据上一次的输出结果来判断这次的输入,也就是要求我们强制在线,不能够把输入全部储存后处理 如果不要求强制在线,我们可以先把所以输入储存起来,从最后开始处理,把删边改成加边,如果在加 ...

  8. [BZOJ4423][AMPPZ2013]Bytehattan(对偶图+并查集)

    建出对偶图,删除一条边时将两边的格子连边.一条边两端连通当且仅当两边的格子不连通,直接并查集处理即可. #include<cstdio> #include<algorithm> ...

  9. hdu Portal(离线,并查集)

    题意:在一张无向图上,已知边权,做q组询问,问小于L的点对共有几组.点对间的距离取=min(两点之间每一条通路上的最大值). 分析:这里取最大值的最小值,常用到二分.而这里利用离线算法,先对边从小到大 ...

随机推荐

  1. 【代码沉淀】 - EPPlus - 操作xlsx表格文件

    EPPlus - Create advanced Excel spreadsheets on the server.web: http://epplus.codeplex.com/nuget: Ins ...

  2. idea alt+enter导包时被锁定导某一个包时的解决方法

    在只有一个包指向的时候,把光标放在Test这种字符之间的话 就会直接导这个 所以把光标放在最后就可以导别的了

  3. request,logging,ConfigParser——接口框架

    做一个将参数和用例分开放置,并且输出log的接口测试框架 我的框架如下所示 Log文件用来设置log输出文件,需要时可以在用例内调用输出,config用来填写一切需要的参数信息,jiekou_post ...

  4. 借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流

    下载源代码请访问原文地址:借助全新 MATLAB® 适配器代码示例读取英特尔® 实感™ 摄像头数据流 简介 该可下载代码示例简要介绍了如何使用英特尔® 实感™ SDK 和 MATLAB 的图像采集工具 ...

  5. VR中射线点击按钮的实现

    VR中实现UI的Button点击,主要是需要实现IPointerClickHandler接口,因为在Unity将所有的按钮操作都封装成了相应的接口,需要相应的功能只需要去实现对应的接口就好了.在这里我 ...

  6. JAVA基础学习之路(十一)引用传递

    引用传递: 不同栈内存可以指向同一块堆内存,不同栈内存可以对一块堆内存进行修改 范例一: class Message { private int num = 10; public Message(in ...

  7. Memcached&PHP-Memcache安装配置

    参考文档: memcache官网:https://memcached.org/ 参考:http://www.runoob.com/memcached/memcached-install.html 参考 ...

  8. java之接口开发-初级篇-webservice协议

    webservice协议 客户端: 客户端生成使用soapUI生成 外部提供webservice地址,地址后加?wsdl.选择好目录然后生成,放到项目中实现 服务端: web.xml平级目录下创建se ...

  9. Amazon.com 购物 信用卡预售期

    I understand and thanks for confirming. In this case, the $1.00 is not a charge.  It is an authoriza ...

  10. TP框架代码学习 学习记录 3.2.3

    文件:think.class.php PHP提供register_shutdown_function()这个函数,能够在脚本终止前回调注册的函数,也就是当 PHP 程序执行完成后执行的函数.regis ...