Beam Cannon HDU - 5091 (扫描线) 求矩形内的点的数量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5091
题意:给你n个二维平面的点 矩形的高h,宽w,让你求这个矩形 在某个位置时包括的最多的点的数量
扫面线板子,注意处理坐标的方式
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <string>
#include <queue>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
#define RD(x) scanf("%d",&x)
#define RD2(x,y) scanf("%d%d",&x,&y)
#define RD3(x,y,z) scanf("%d%d%d",&x,&y,&z)
#define clr0(x) memset(x,0,sizeof(x))
#define clr1(x) memset(x,-1,sizeof(x))
#define eps 1e-9
const double pi = acos(-1.0);
typedef long long LL;
#define lson i*2,l,m
#define rson i*2+1,m+1,r
const int MAXN=200000+5;//因为点有1W个,所以扫描线2W个,不同的Y坐标最多有2W个
int cnt[MAXN*4],sum[MAXN*4];
double Y[MAXN];
struct seg
{double l,r,h;int d;seg(){}seg(double a,double b,double c,int d):l(a),r(b),h(c),d(d){}bool operator <(const seg&b)const{if(h == b.h) return d>b.d;return h<b.h;}
}ss[MAXN];
void PushUp(int i)
{sum[i]=max(sum[i*2],sum[i*2+1]) + cnt[i];
}
void update(int ql,int qr,int v,int i,int l,int r)
{if(ql<=l && r<=qr){cnt[i]+=v;sum[i]+=v;return ;}int m=(l+r)>>1;if(ql<=m) update(ql,qr,v,lson);if(m<qr) update(ql,qr,v,rson);PushUp(i);
}
int main()
{int n;double w,h;while(~RD(n)){if(n == -1)break;scanf("%lf%lf",&w,&h); w+=0.5,h+=0.5;double x,y;int val;int cnt_y=0,cnt_ss=0;//记录有多少个Y值和扫描线for(int i=1;i<=n;i++){scanf("%lf%lf",&x,&y);//x+=20000,y+=20000;ss[cnt_ss++] = seg(y-h/2,y+h/2,x-w/2,1);ss[cnt_ss++] = seg(y-h/2,y+h/2,x+w/2,-1);Y[cnt_y++] = y-h/2;Y[cnt_y++] = y+h/2;}sort(ss,ss+cnt_ss);sort(Y,Y+cnt_y);cnt_y = unique(Y,Y+cnt_y)-Y;int ans=0;clr0(cnt),clr0(sum);for(int i=0;i<cnt_ss-1;i++){int ql=lower_bound(Y,Y+cnt_y,ss[i].l)-Y;int qr=lower_bound(Y,Y+cnt_y,ss[i].r)-Y-1;if(ql<=qr) update(ql,qr,ss[i].d,1,0,cnt_y-1);ans=max(ans,sum[1]);}printf("%d\n",ans);}
}
Beam Cannon HDU - 5091 (扫描线) 求矩形内的点的数量相关推荐
- Picture HDU - 1828 (扫描线求矩形周长并)
题目连接:https://cn.vjudge.net/problem/HDU-1828 题意:给你n个矩形,让你求矩形的轮廓的周长之和 两遍扫描线从左到右,从下到上即可. #include <i ...
- 线段树扫描线求矩形周长详解
线段树扫描线求矩形周长详解 原创 wucstdio 最后发布于2018-04-24 16:12:09 阅读数 841 收藏 发布于2018-04-24 16:12:09 版权声明:本文为博主原创文章, ...
- hdu 1255 覆盖的面积 (扫描线求矩形交)
覆盖的面积 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Sub ...
- poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长
Picture 题意:求矩形面积并额轮廓长 解法:扫描线+离散化+线段树 做法:等于更新操作前后的tree[1].len差,做法这么巧妙实际我也不知道为什么.差不多的意思就是更新操作的cover变化长 ...
- hdu1828 线段树扫描线求矩形面积的周长
题意: 给你n个矩形,问你这n个矩形所围成的图形的周长是多少. 思路: 线段树的扫描线简单应用,这个题目我用的方法比较笨,就是扫描两次,上下扫描,求出多边形的上下边长和,然后同 ...
- 蒙特卡洛算法求矩形内切圆面积
已知:矩形长宽皆为1,则内切圆半径为0.5.求:该圆面积(利用蒙特卡洛算法) 编程思路如下: 1,利用random.unifom生成0到1之间的数字,分别赋值给x,y. 2,判断生成点是否落在矩形区域 ...
- hdu1542 线段树扫描线求矩形面积的并
题意: 给你n个正方形,求出他们的所占面积有多大,重叠的部分只能算一次. 思路: 自己的第一道线段树扫描线题目,至于扫描线,最近会写一个总结,现在就不直接在这里写了,说下我的方 ...
- hdu 4007 Dave 求矩形圈点最大值
对于每个点,扩成一个矩形,变成求最大重叠层数: 注意边界的处理,这里是横纵均加一: 可能在边界上会产生一些问题,在排序的时候修正: #include<algorithm> #include ...
- POJ1151(线段树+扫描线求矩形面积并)
题目:http://poj.org/problem?id=1151 #include <iostream> #include <string.h> #include <a ...
最新文章
- TPP多租户隔离之资源清理
- java web 笔试 题_JavaWeb综合笔试题(带答案).doc
- 比较两个日期大小和获取当前月最大天数的存储过程
- sqlserver获得到当前游标中存在的数据行数
- makefile之通配符(4)
- java gc与finalize_finalize方法与Java GC
- c++ 单引和双引的区别
- Windows-Server-2012-如何实现多个用户远程桌面登陆
- python导入鸢尾花数据集_python可视化分析鸢尾花数据集
- es的range过滤_ElasticSearch 常用的查询过滤语句
- java中的gc是什么意思的缩写_gc是什么意思(gc是什么意思的缩写)
- 为什么博途V17及以下的HMI面板不能与1500固件版本2.9或1200版本4.5 的CPU建立连接?
- 路口待行区设置条件与通行效能分析
- 银行卡识别技术-移动支付新宠儿
- Room 使用及初步分析
- ThinkAdmin学习总结
- 吸烟者问题C++实现
- 移动宽带运营商服务器未响应,中国移动宽带网络有问题怎么办
- 系统集成十大项目管理(1)
- 如何查看AD域账号的删除记录
热门文章
- 十年一觉扬州梦,赢得青楼薄幸名
- ROS-RouterOS hAP ac2+usb 4G上网卡+小米新推的无线上网卡是绝配
- Item Tagging for Information Retrieval: A Tripartite Graph Neural Network based Approach 用于信息检索的项目标签
- 苹果iOS4被开发者做成 App
- 【PCB】Altium Designer 中(Via过孔)(文本string)(走线Linear Dimension)等项目修改默认设置
- 【python编程】使用python获取机器所在网络的公网IP(第二种方法)
- 数据结构与算法 -- 树结构与图结构
- vs如何调出黑色的界面主题
- 三款学生必备的学习笔记工具,让你暑假变学霸
- 由一张血管图片引发的算法分析(二)