题目链接

题意:

  给出若干个点的坐标,用一个W*H的矩形去覆盖,问最多能覆盖几个点。

思路:

  这是2014上海全国邀请赛的题目,以前写过,重新学习扫描线。首先把所有点移到第一象限([0, 40000]),每个点从左到右排序,每个点在Y轴看成[y,y+H]的线段,扫描线从左到右扫描,把这条线段在线段树上+1,表示进矩形框,然后扫到这点对应的(x+W, y)的位置就-1,表示出了这个矩形框。那么线段树维护连续区间的线段的最大重叠数,即能覆盖到点的最大数量。

  1. #include <bits/stdc++.h>
  2.  
  3. const int N = 1e4 + 5;
  4. struct Point {
  5. int x, y, z;
  6. };
  7. Point point[N<<1];
  8.  
  9. bool cmp(const Point &a, const Point &b) {
  10. return a.x == b.x ? a.z > b.z : a.x < b.x;
  11. }
  12.  
  13. #define lson l, mid, o << 1
  14. #define rson mid + 1, r, o << 1 | 1
  15. const int H = 40000 + 5;
  16. int sum[H<<2], lazy[H<<2];
  17.  
  18. void push_up(int o) {
  19. sum[o] = std::max (sum[o<<1], sum[o<<1|1]);
  20. }
  21.  
  22. void push_down(int o) {
  23. if (lazy[o]) {
  24. lazy[o<<1] += lazy[o];
  25. lazy[o<<1|1] += lazy[o];
  26. sum[o<<1] += lazy[o];
  27. sum[o<<1|1] += lazy[o];
  28. lazy[o] = 0;
  29. }
  30. }
  31.  
  32. void build(int l, int r, int o) {
  33. sum[o] = 0; lazy[o] = 0;
  34. if (l == r) {
  35. return ;
  36. }
  37. int mid = l + r >> 1;
  38. build (lson);
  39. build (rson);
  40. }
  41.  
  42. void updata(int ql, int qr, int c, int l, int r, int o) {
  43. if (ql <= l && r <= qr) {
  44. sum[o] += c; lazy[o] += c;
  45. return ;
  46. }
  47. push_down (o);
  48. int mid = l + r >> 1;
  49. if (ql <= mid) {
  50. updata (ql, qr, c, lson);
  51. }
  52. if (qr > mid) {
  53. updata (ql, qr, c, rson);
  54. }
  55. push_up (o);
  56. }
  57.  
  58. int main() {
  59. int n, w, h;
  60. while (scanf ("%d", &n) == 1 && n > 0) {
  61. scanf ("%d%d", &w, &h);
  62. int tot = 0;
  63. for (int i=0; i<n; ++i) {
  64. int x, y;
  65. scanf ("%d%d", &x, &y);
  66. x += 20000; y += 20000;
  67. point[tot].x = x; point[tot].y = y;
  68. point[tot++].z = 1;
  69. point[tot].x = x + w; point[tot].y = y;
  70. point[tot++].z = -1;
  71. }
  72. std::sort (point, point+tot, cmp);
  73. build (0, 40000, 1);
  74. int ans = 0;
  75. for (int i=0; i<tot; ++i) {
  76. int ql = point[i].y, qr = point[i].y + h;
  77. if (qr > 40000) qr = 40000;
  78. updata (ql, qr, point[i].z, 0, 40000, 1);
  79. ans = std::max (ans, sum[1]);
  80. }
  81. printf ("%d\n", ans);
  82. }
  83. return 0;
  84. }

  

线段树+扫描线 HDOJ 5091 Beam Cannon(大炮)的更多相关文章

  1. HDOJ 5091 Beam Cannon 扫描线

    线段树+扫描线: 我们用矩形的中心点来描写叙述这个矩形,然后对于每一个敌舰,我们建立一个矩形中心的活动范围,即矩形中心在该范围内活动就能够覆盖到该敌舰.那么我们要求的问题就变成了:随意一个区域(肯定也 ...

  2. hdu 5091 Beam Cannon(扫描线段树)

    题目链接:hdu 5091 Beam Cannon 题目大意:给定N个点,如今要有一个W∗H的矩形,问说最多能圈住多少个点. 解题思路:线段的扫描线,如果有点(x,y),那么(x,y)~(x+W,y+ ...

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

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

  4. 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)

    D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...

  5. Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)

    题目链接:http://codeforces.com/contest/522/problem/D 题目大意:  给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...

  6. 【POJ-2482】Stars in your window 线段树 + 扫描线

    Stars in Your Window Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11706   Accepted:  ...

  7. HDU 4419 Colourful Rectangle --离散化+线段树扫描线

    题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...

  8. BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤

    3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...

  9. BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞

    看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...

随机推荐

  1. Delphi和C++的语法区别 (关于构造和析构)

    目录 Delphi永远没办法在栈上创建一个对象 Delphi的构造函数更象是个类方法(静态成员函数) Delphi的析构函数中可以调用纯虚方法 Delphi在构造对象时自动将成员变量清零 Delphi ...

  2. DTD复习笔记(复习资料为菜鸟教程里的DTD教程)

    DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块. DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. 为什么使用 DTD? 通过 DTD,您的每一个 XML 文件均可携带 ...

  3. MRP-MD04 中的函数

    1.需求溯源 : MD_PEGGING_NODIALOG 2.实时库存 : MD_STOCK_REQUIREMENTS_LIST_API 这个函数中MDPSX 和 MDEZX 是通过 MDPS 的 I ...

  4. linux 解决 Device eth0 does not seem to be present

    在虚拟机中安装cent os系统,然后配置网络 执行命令ifconfig 没有看到eth0的信息: 重启网卡报错: service network restart Shutting down loop ...

  5. LIS n^2&nlogn模板

    LIS nlogn模板 http://acm.hdu.edu.cn/showproblem.php?pid=1950 #include <iostream> #include <st ...

  6. vue开发总结(一)

    vue使用快一个多月了,从移动端到PC端,踩过的坑也不少.项目的开发是基于element ui 与 mint ui 组件库,下面总结下项目中的一些知识点: 一.网页数据请求 首次进入页面,需要请求数据 ...

  7. YTU 2577: 小数计算——结构体

    2577: 小数计算--结构体 时间限制: 1 Sec  内存限制: 128 MB 提交: 978  解决: 647 题目描述 小数可以看成是一个点和两个数组成的,因此可以定义成一个小数的结构体,现在 ...

  8. 织梦dedecms首页/列表页/内容页调用tag的方法(未测试)

    织梦dedecms首页/列表页/内容页调用tag的方法 在网站中tag是网站搜索相关文章的联系之一,也可以有专门的tag页面,在不同的页面也可以调用tag,而不是只有在首页和列表页才可以调用tag,这 ...

  9. C# 利用Aspose.Cells .dll将本地excel文档转化成pdf(完美破解版 无水印 无中文乱码)

    Aspose.Cells .dll下载  http://pan.baidu.com/s/1slRENLF并引用 C#代码 using System; using System.Collections. ...

  10. class.forName()和.class有什么区别?

    class.forName()会初始化类的成员(静态的),最先加载的是类的静态成员变量,然后是静态代码块. 访问常量并不会导致类的初始化,但是访问静态成员会.