题意:

有一些平行于y轴的线段 ,两条线段称为互相可见当且仅当存在一条水平线段连接这两条  与其他线段没交点。 最后问有多少组  3条线段,他们两两是可见的。

思路:

线段树,找出两两可见的那些组合,最后暴力判断。

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<vector>
  7. #define debug(x) printf(#x"= %d \n",x);
  8. #define N 20000
  9. using namespace std;
  10. int id[N*];
  11. vector<int>e[N];
  12. void build(int l,int r,int i)
  13. {
  14. id[i]=;
  15. if(l!=r)
  16. {
  17. int mid=(l+r)>>;
  18. build(l,mid,i<<);
  19. build(mid+,r,i<<|);
  20. }
  21. }
  22. void pushdown(int i)
  23. {
  24. if(id[i]!=-)
  25. {
  26. id[i<<]=id[i<<|]=id[i];
  27. id[i]=-;
  28. }
  29. }
  30. void update(int l,int r,int pl,int pr,int va,int i)
  31. {
  32. if(l>=pl&&r<=pr)
  33. {
  34. if(id[i]!=-)
  35. {
  36. e[id[i]].push_back(va);
  37. id[i]=va;
  38. return;
  39. }
  40. id[i]=va;
  41. }
  42. if(id[i]!=va)
  43. pushdown(i);
  44. int mid=(l+r)>>;
  45. if(pl<=mid)update(l,mid,pl,pr,va,i<<);
  46. if(pr>mid)update(mid+,r,pl,pr,va,i<<|);
  47. }
  48. struct node
  49. {
  50. int y1,y2,x;
  51. }s[];
  52. bool cmp(node a,node b)
  53. {
  54. return a.x<b.x;
  55. }
  56. int cas[N];
  57. int main() {
  58. int tt,n,ri=;
  59. memset(cas,,sizeof(cas));
  60. scanf("%d",&tt);
  61. while(tt--)
  62. {
  63. int maxn=;
  64. build(,maxn,);
  65. scanf("%d",&n);
  66. for(int i=;i<=n;++i)
  67. {
  68. scanf("%d%d%d",&s[i].y1,&s[i].y2,&s[i].x);
  69. s[i].y1++;
  70. s[i].y2++;
  71. s[i].y1=s[i].y1*-;
  72. s[i].y2=s[i].y2*-;
  73. }
  74. sort(s+,s+n+,cmp);
  75. for(int i=;i<=n;++i)e[i].clear();
  76. for(int i=;i<=n;++i)
  77. {
  78. int l,r;
  79. l=s[i].y1;
  80. r=s[i].y2;
  81. update(,maxn,l,r,i,);
  82. }
  83. for(int i=;i<=n;++i)
  84. {
  85. sort(e[i].begin(),e[i].end());
  86. e[i].erase(unique(e[i].begin(),e[i].end()),e[i].end());//去重
  87. }
  88. int ans=;
  89. for(int i=;i<=n;++i)
  90. {
  91. ri++;
  92. for(int j=;j<e[i].size();++j)
  93. cas[e[i][j]]=ri;
  94. for(int j=;j<e[i].size();++j)
  95. {
  96. int now=e[i][j];
  97. for(int k=;k<e[now].size();++k)
  98. {
  99. if(cas[e[now][k]]==ri)
  100. {
  101. // printf("%d %d %d\n",i,now,e[now][k]);
  102. ans++;
  103. }
  104. }
  105. }
  106. }
  107. printf("%d\n",ans);
  108. }
  109. return ;
  110. }

POJ 1436 Horizontally Visible Segments的更多相关文章

  1. POJ 1436 Horizontally Visible Segments(线段树)

    POJ 1436 Horizontally Visible Segments 题目链接 线段树处理染色问题,把线段排序.从左往右扫描处理出每一个线段能看到的右边的线段,然后利用bitset维护枚举两个 ...

  2. POJ 1436 Horizontally Visible Segments (线段树&#183;区间染色)

    题意   在坐标系中有n条平行于y轴的线段  当一条线段与还有一条线段之间能够连一条平行与x轴的线不与其他线段相交  就视为它们是可见的  问有多少组三条线段两两相互可见 先把全部线段存下来  并按x ...

  3. (中等) POJ 1436 Horizontally Visible Segments , 线段树+区间更新。

    Description There is a number of disjoint vertical line segments in the plane. We say that two segme ...

  4. POJ 1436.Horizontally Visible Segments-线段树(区间更新、端点放大2倍)

    水博客,水一水. Horizontally Visible Segments Time Limit: 5000MS   Memory Limit: 65536K Total Submissions:  ...

  5. poj 1436 && zoj 1391 Horizontally Visible Segments (Segment Tree)

    ZOJ :: Problems :: Show Problem 1436 -- Horizontally Visible Segments 用线段树记录表面能被看见的线段的编号,然后覆盖的时候同时把能 ...

  6. 【37%】【poj1436】Horizontally Visible Segments

    Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5200   Accepted: 1903 Description There ...

  7. POJ 1436 (线段树 区间染色) Horizontally Visible Segments

    这道题做了快两天了.首先就是按照这些竖直线段的横坐标进行从左到右排序. 将线段的端点投影到y轴上,线段树所维护的信息就是y轴区间内被哪条线段所覆盖. 对于一条线段来说,先查询和它能相连的所有线段,并加 ...

  8. 【解题报告】pojP1436 Horizontally Visible Segments

    http://poj.org/problem?id=1436 题目大意:有n条平行于x轴的线段,每条线段有y坐标,如果两条线段有一段x坐标数值相等,且中间没有其它线段阻隔,则称这两条线段"照 ...

  9. poj1436 Horizontally Visible Segments

    这是一个区间更新的题目,先将区间放大两倍,至于为什么要放大可以这样解释,按照从左到右有4个区间,y值是[1,5],[1,2],[3,4],[1,4]如果不放大的话,查询[1,4]区间和前面区间的”可见 ...

随机推荐

  1. access denied ("java.net.SocketPermission" "localhost:1527" "listen,resolve")

    在开启derby服务出现该错误(测试hibernate 连接数据库时  使用myeclipse2014自带的数据库--windows->show view->other->Myecl ...

  2. (六)ARM状态寄存器-PSR

    ARM程序状态寄存器Program State Register 在ARM模式中, 有16个数据寄存器和1或2个状态寄存器是可以随时访问的.在特权模式 (privileged mode) 下, 对应的 ...

  3. java语法糖3 深入剖析Java中的装箱和拆箱

    装箱 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10); 而在从Java SE5开始就提供了自动装箱的特性, ...

  4. Multipath多路径冗余全解

    一.什么是multipath 普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系.而到了有光纤组成的SAN环境,由于主机和存储通过了光纤交换机连接,这样的话,就构成了多对多的关系.也就是说 ...

  5. samba服务器搭建

    为实现windows与linux资源共享,搭建一个samba服务器:这个我也是探索了一段时间. 找到一篇写得比较清楚的博客: http://yangxuejun.blog.51cto.com/6239 ...

  6. nginx的启动与关闭

    [root@nginx ~]# #默认启动方式 [root@nginx ~]# which nginx /sbin/nginx [root@nginx ~]# nginx [root@nginx ~] ...

  7. import package的问题

    在新建class的时候除了名字还可以选择包名: 新建2个包名,然后在不同的包里写2个同名的类, 程序中导入另外一个包 package com.hs;import com.hy.Father; 当直接使 ...

  8. Selenium解决页面元素不在视野范围内的问题

    当需要使用滚动条才能使页面元素显示在视野范围内时,必须用代码处理下,才能对其进行操作. 处理其实也很简单,就是调用JS函数. driver.executeScript("arguments[ ...

  9. VC++NMAKE

    目录 第1章 NMAKE    1 1.1 运行NMAKE    1 1.1.1 NMAKE的实质    2 1.2 描述块    3 1.2.1 定义    3 1.2.2 多个描述块    3 1 ...

  10. java 内部类3(匿名内部类)

    匿名内部类: 1.没有类名的类就叫匿名内部类 2.好处:简化书写. 3.使用前提:必须有继承或实现关系......不要想着你自己没有钱你没可是你爸有 4.一般用于于实参.(重点) class Oute ...