给出N个矩形,M次询问

每次询问给出R个。问这R个矩形围成的面积

经典扫面线求面积并,对每次询问的R个点离散化一下

  1. #include "stdio.h"
  2. #include "string.h"
  3. #include "algorithm"
  4. #include "map"
  5. using namespace std;
  6.  
  7. map<int,int>mp;
  8.  
  9. struct P
  10. {
  11. int x1,y1,x2,y2;
  12. }p[21];
  13.  
  14. struct Mark
  15. {
  16. int l,r,x,dir;
  17. }mark[41];
  18.  
  19. struct node
  20. {
  21. int l,r,y,s;
  22. }data[410];
  23.  
  24. int h[50];
  25.  
  26. bool cmp(Mark a,Mark b)
  27. {
  28. return a.x<b.x;
  29. }
  30.  
  31. void callen(int k)
  32. {
  33. if (data[k].s>0) data[k].y=h[data[k].r]-h[data[k].l];
  34. else
  35. data[k].y=data[k*2].y+data[k*2+1].y;
  36. }
  37.  
  38. void build(int l,int r,int k)
  39. {
  40. int mid;
  41. data[k].l=l;
  42. data[k].r=r;
  43. data[k].y=0;
  44. data[k].s=0;
  45.  
  46. if (l+1==r) return;
  47.  
  48. mid=(l+r)/2;
  49.  
  50. build(l,mid,k*2);
  51. build(mid,r,k*2+1);
  52. }
  53.  
  54. void updata(int l,int r,int k,int op)
  55. {
  56. int mid;
  57.  
  58. if (data[k].l==l && data[k].r==r)
  59. {
  60. data[k].s+=op;
  61. callen(k);
  62. return ;
  63. }
  64.  
  65. mid=(data[k].l+data[k].r)/2;
  66.  
  67. if (r<=mid) updata(l,r,k*2,op);
  68. else
  69. if (l>=mid) updata(l,r,k*2+1,op);
  70. else
  71. {
  72. updata(l,mid,k*2,op);
  73. updata(mid,r,k*2+1,op);
  74. }
  75. callen(k);
  76. }
  77.  
  78. int main()
  79. {
  80. int Case,cnt,i,ii,r,n,m,ans,k;
  81. Case=0;
  82. while (scanf("%d%d",&n,&m)!=EOF)
  83. {
  84. if (n==0 && m==0) break;
  85. for (i=1;i<=n;i++)
  86. scanf("%d%d%d%d",&p[i].x1,&p[i].y1,&p[i].x2,&p[i].y2);
  87.  
  88. printf("Case %d:\n",++Case);
  89. for (ii=1;ii<=m;ii++)
  90. {
  91. scanf("%d",&r);
  92. for (i=0;i<r;i++)
  93. {
  94. scanf("%d",&k);
  95. mark[i*2].x=p[k].x1;
  96. mark[i*2].l=p[k].y1;
  97. mark[i*2].r=p[k].y2;
  98. mark[i*2].dir=1;
  99. mark[i*2+1].x=p[k].x2;
  100. mark[i*2+1].l=p[k].y1;
  101. mark[i*2+1].r=p[k].y2;
  102. mark[i*2+1].dir=-1;
  103. h[i*2]=p[k].y1;
  104. h[i*2+1]=p[k].y2;
  105. }
  106.  
  107. sort(h,h+r*2);
  108. cnt=unique(h,h+r*2)-h;
  109.  
  110. for (i=0;i<cnt;i++)
  111. mp[h[i]]=i;
  112. sort(mark,mark+r*2,cmp);
  113. for (i=0;i<r*2;i++)
  114. {
  115. mark[i].l=mp[mark[i].l];
  116. mark[i].r=mp[mark[i].r];
  117. }
  118. ans=0;
  119. build(0,cnt,1);
  120. updata(mark[0].l,mark[0].r,1,mark[0].dir);
  121.  
  122. for (i=1;i<r*2;i++)
  123. {
  124. ans+=(mark[i].x-mark[i-1].x)*data[1].y;
  125. updata(mark[i].l,mark[i].r,1,mark[i].dir);
  126. }
  127. printf("Query %d: %d\n",ii,ans);
  128. }
  129. printf("\n");
  130. }
  131. return 0;
  132. }

HDU 2461 线段树扫描线的更多相关文章

  1. hdu 4052 线段树扫描线、奇特处理

    Adding New Machine Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  2. hdu 1828 线段树扫描线(周长)

    Picture Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. hdu 5091(线段树+扫描线)

    上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...

  4. HDU 5107 线段树扫描线

    给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...

  5. hdu 1255(线段树 扫描线) 覆盖的面积

    http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...

  6. HDU 5091 线段树扫描线

    给出N个点.和一个w*h的矩形 给出N个点的坐标,求该矩形最多能够覆盖多少个点 对每一个点point(x.y)右边生成相应的点(x+w,y)值为-1: 纵向建立线段树,从左到右扫描线扫一遍.遇到点则用 ...

  7. hdu 1542 线段树+扫描线 学习

    学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...

  8. hdu 4419 线段树 扫描线 离散化 矩形面积

    //离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...

  9. hdu 3265 线段树扫描线(拆分矩形)

    题意:        给你n个矩形,每个矩形上都有一个矩形的空洞,所有的矩形都是平行于x,y轴的,最后问所有矩形的覆盖面积是多少. 思路:       是典型的矩形覆盖问题,只不过每个矩形上多了一个矩 ...

随机推荐

  1. oracle 用sql语句管理数据库

    基础sql语句 创建数据库 :create database database_name; 创建表:create table(字段名 字段类型 字段为空约束 ,字段名 字段类型 字段为空约束,,,, ...

  2. vuex理解之modules小记

    好记性不如烂笔头 demo预览 源代码 前情提要 关于vuex,其实很久以前就研究使用过,还研究过 flux,redux之类的体系,当时感觉对于 state,action,dispatch,views ...

  3. Array与NSArray关系

    NSArray与Array之间的关系如同NSString与String之间的关系,NSArray是类类型,而Array是结构体类型,一个是引用类型,一个是值类型,它们是怎样实现无缝转换的呢?Swift ...

  4. Jenkins系列之Jenkins的工具配置和插件(二)

    上一篇我们介绍了Jenkins的安装,这一篇我们介绍如何配置Jenkins的工具和如何下载插件. 首先我们先来看如何配置工具,这里的工具是指JDK.Ant.Maven.Git等. 一.如图,点击系统管 ...

  5. win10系统杀毒功能

    最近很多客户的电脑都是win10的,部署web服务时用到的破解软件(exe文件),经常被当成病毒杀死,今天发现可以在杀毒记录里找到刚刚被杀掉的文件,然后点击操作,点击允许,再运行时就可以畅通无阻了

  6. CAD设置水印

    主要用到函数说明: _DMxDrawX::Watermark 设置控件水印图片显示,字符串用逗号隔开,分为: “文件名,透明度,x方向距离,y方向距离,是否居中”, 是否居中0代表在上角定位,1表示自 ...

  7. 04Servlet的生命周期

    Servlet的生命周期 Servlet运行在Servlet容器中,其生命周期由容器来管理.Servlet的生命周期通过javax.servlet.Servlet接口中的init().service( ...

  8. 【转载】Java下利用Jackson进行JSON解析和序列化

    参考资料: https://blog.csdn.net/sdut406/article/details/85647982 Java下常见的Json类库有Gson.JSON-lib和Jackson等,J ...

  9. docker 转载

    写的非常好的一篇文章,不知道为什么被删除了.  利用Google快照,做个存档. 快照地址:地址 作者地址:青牛 什么是docker Docker 是一个开源项目,诞生于 2013 年初,最初是 do ...

  10. videojs

    <link href="http://vjs.zencdn.net/5.5.3/video-js.css" rel="stylesheet"> &l ...