线段树+扫描线 HDOJ 5091 Beam Cannon(大炮)
题意:
给出若干个点的坐标,用一个W*H的矩形去覆盖,问最多能覆盖几个点。
思路:
这是2014上海全国邀请赛的题目,以前写过,重新学习扫描线。首先把所有点移到第一象限([0, 40000]),每个点从左到右排序,每个点在Y轴看成[y,y+H]的线段,扫描线从左到右扫描,把这条线段在线段树上+1,表示进矩形框,然后扫到这点对应的(x+W, y)的位置就-1,表示出了这个矩形框。那么线段树维护连续区间的线段的最大重叠数,即能覆盖到点的最大数量。
- #include <bits/stdc++.h>
- const int N = 1e4 + 5;
- struct Point {
- int x, y, z;
- };
- Point point[N<<1];
- bool cmp(const Point &a, const Point &b) {
- return a.x == b.x ? a.z > b.z : a.x < b.x;
- }
- #define lson l, mid, o << 1
- #define rson mid + 1, r, o << 1 | 1
- const int H = 40000 + 5;
- int sum[H<<2], lazy[H<<2];
- void push_up(int o) {
- sum[o] = std::max (sum[o<<1], sum[o<<1|1]);
- }
- void push_down(int o) {
- if (lazy[o]) {
- lazy[o<<1] += lazy[o];
- lazy[o<<1|1] += lazy[o];
- sum[o<<1] += lazy[o];
- sum[o<<1|1] += lazy[o];
- lazy[o] = 0;
- }
- }
- void build(int l, int r, int o) {
- sum[o] = 0; lazy[o] = 0;
- if (l == r) {
- return ;
- }
- int mid = l + r >> 1;
- build (lson);
- build (rson);
- }
- void updata(int ql, int qr, int c, int l, int r, int o) {
- if (ql <= l && r <= qr) {
- sum[o] += c; lazy[o] += c;
- return ;
- }
- push_down (o);
- int mid = l + r >> 1;
- if (ql <= mid) {
- updata (ql, qr, c, lson);
- }
- if (qr > mid) {
- updata (ql, qr, c, rson);
- }
- push_up (o);
- }
- int main() {
- int n, w, h;
- while (scanf ("%d", &n) == 1 && n > 0) {
- scanf ("%d%d", &w, &h);
- int tot = 0;
- for (int i=0; i<n; ++i) {
- int x, y;
- scanf ("%d%d", &x, &y);
- x += 20000; y += 20000;
- point[tot].x = x; point[tot].y = y;
- point[tot++].z = 1;
- point[tot].x = x + w; point[tot].y = y;
- point[tot++].z = -1;
- }
- std::sort (point, point+tot, cmp);
- build (0, 40000, 1);
- int ans = 0;
- for (int i=0; i<tot; ++i) {
- int ql = point[i].y, qr = point[i].y + h;
- if (qr > 40000) qr = 40000;
- updata (ql, qr, point[i].z, 0, 40000, 1);
- ans = std::max (ans, sum[1]);
- }
- printf ("%d\n", ans);
- }
- return 0;
- }
线段树+扫描线 HDOJ 5091 Beam Cannon(大炮)的更多相关文章
- HDOJ 5091 Beam Cannon 扫描线
线段树+扫描线: 我们用矩形的中心点来描写叙述这个矩形,然后对于每一个敌舰,我们建立一个矩形中心的活动范围,即矩形中心在该范围内活动就能够覆盖到该敌舰.那么我们要求的问题就变成了:随意一个区域(肯定也 ...
- hdu 5091 Beam Cannon(扫描线段树)
题目链接:hdu 5091 Beam Cannon 题目大意:给定N个点,如今要有一个W∗H的矩形,问说最多能圈住多少个点. 解题思路:线段的扫描线,如果有点(x,y),那么(x,y)~(x+W,y+ ...
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- 【Codeforces720D】Slalom 线段树 + 扫描线 (优化DP)
D. Slalom time limit per test:2 seconds memory limit per test:256 megabytes input:standard input out ...
- Codeforces VK CUP 2015 D. Closest Equals(线段树+扫描线)
题目链接:http://codeforces.com/contest/522/problem/D 题目大意: 给你一个长度为n的序列,然后有m次查询,每次查询输入一个区间[li,lj],对于每一个查 ...
- 【POJ-2482】Stars in your window 线段树 + 扫描线
Stars in Your Window Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11706 Accepted: ...
- HDU 4419 Colourful Rectangle --离散化+线段树扫描线
题意: 有三种颜色的矩形n个,不同颜色的矩形重叠会生成不同的颜色,总共有R,G,B,RG,RB,GB,RGB 7种颜色,问7种颜色每种颜色的面积. 解法: 很容易想到线段树扫描线求矩形面积并,但是如何 ...
- BZOJ-3228 棋盘控制 线段树+扫描线+鬼畜毒瘤
3228: [Sdoi2008]棋盘控制 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 23 Solved: 9 [Submit][Status][D ...
- BZOJ-3225 立方体覆盖 线段树+扫描线+乱搞
看数据范围像是个暴力,而且理论复杂度似乎可行,然后被卡了两个点...然后来了个乱搞的线段树+扫描线.. 3225: [Sdoi2008]立方体覆盖 Time Limit: 2 Sec Memory L ...
随机推荐
- Delphi和C++的语法区别 (关于构造和析构)
目录 Delphi永远没办法在栈上创建一个对象 Delphi的构造函数更象是个类方法(静态成员函数) Delphi的析构函数中可以调用纯虚方法 Delphi在构造对象时自动将成员变量清零 Delphi ...
- DTD复习笔记(复习资料为菜鸟教程里的DTD教程)
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块. DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用. 为什么使用 DTD? 通过 DTD,您的每一个 XML 文件均可携带 ...
- MRP-MD04 中的函数
1.需求溯源 : MD_PEGGING_NODIALOG 2.实时库存 : MD_STOCK_REQUIREMENTS_LIST_API 这个函数中MDPSX 和 MDEZX 是通过 MDPS 的 I ...
- linux 解决 Device eth0 does not seem to be present
在虚拟机中安装cent os系统,然后配置网络 执行命令ifconfig 没有看到eth0的信息: 重启网卡报错: service network restart Shutting down loop ...
- LIS n^2&nlogn模板
LIS nlogn模板 http://acm.hdu.edu.cn/showproblem.php?pid=1950 #include <iostream> #include <st ...
- vue开发总结(一)
vue使用快一个多月了,从移动端到PC端,踩过的坑也不少.项目的开发是基于element ui 与 mint ui 组件库,下面总结下项目中的一些知识点: 一.网页数据请求 首次进入页面,需要请求数据 ...
- YTU 2577: 小数计算——结构体
2577: 小数计算--结构体 时间限制: 1 Sec 内存限制: 128 MB 提交: 978 解决: 647 题目描述 小数可以看成是一个点和两个数组成的,因此可以定义成一个小数的结构体,现在 ...
- 织梦dedecms首页/列表页/内容页调用tag的方法(未测试)
织梦dedecms首页/列表页/内容页调用tag的方法 在网站中tag是网站搜索相关文章的联系之一,也可以有专门的tag页面,在不同的页面也可以调用tag,而不是只有在首页和列表页才可以调用tag,这 ...
- C# 利用Aspose.Cells .dll将本地excel文档转化成pdf(完美破解版 无水印 无中文乱码)
Aspose.Cells .dll下载 http://pan.baidu.com/s/1slRENLF并引用 C#代码 using System; using System.Collections. ...
- class.forName()和.class有什么区别?
class.forName()会初始化类的成员(静态的),最先加载的是类的静态成员变量,然后是静态代码块. 访问常量并不会导致类的初始化,但是访问静态成员会.