HDU 5091 线段树扫描线
给出N个点。和一个w*h的矩形
给出N个点的坐标,求该矩形最多能够覆盖多少个点
对每一个点point(x。y)右边生成相应的点(x+w,y)值为-1;
纵向建立线段树,从左到右扫描线扫一遍。遇到点则用该点的权值更新区间(y,y+h)
#include "stdio.h"
#include "string.h"
#include "algorithm"
using namespace std; struct Mark
{
int x,y,s;
}mark[30010]; struct node
{
int l,r,x,lazy;
}data[200010]; bool cmp(Mark a, Mark b)
{
if (a.x!=b.x)
return a.x<b.x;
else
return a.s>b.s;
} int Max(int a,int b)
{
if (a<b) return b;
else return a;
} void build(int l,int r,int k)
{
int mid; data[k].l=l;
data[k].r=r;
data[k].x=0;
data[k].lazy=0; if (l==r) return ;
mid=(l+r)/2; build(l,mid,k*2);
build(mid+1,r,k*2+1);
} void updata(int l,int r,int k,int op)
{
int mid;
if (data[k].l==l && data[k].r==r)
{
data[k].x+=op;
data[k].lazy+=op;
return ;
} if (data[k].lazy!=0)
{
data[k*2].x+=data[k].lazy;
data[k*2].lazy+=data[k].lazy;
data[k*2+1].x+=data[k].lazy;
data[k*2+1].lazy+=data[k].lazy;
data[k].lazy=0;
} mid=(data[k].l+data[k].r)/2; if (r<=mid) updata(l,r,k*2,op);
else
if (l>mid) updata(l,r,k*2+1,op);
else
{
updata(l,mid,k*2,op);
updata(mid+1,r,k*2+1,op);
} data[k].x=Max(data[k*2].x,data[k*2+1].x);
}
int main()
{
int n,w,h,i,x,y,ans;
while (scanf("%d",&n)!=EOF)
{
if (n<0) break;
scanf("%d%d",&w,&h);
for (i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x+=20000;
y+=20000;
mark[i*2].x=x;
mark[i*2].y=y;
mark[i*2].s=1;
mark[i*2+1].x=x+w;
mark[i*2+1].y=y;
mark[i*2+1].s=-1;
}
sort(mark,mark+n*2,cmp);
build(0,40000,1); ans=0;
for (i=0;i<n*2;i++)
{
y=mark[i].y+h;
if (y>40000) y=40000;
updata(mark[i].y,y,1,mark[i].s);
ans=Max(ans,data[1].x);
}
printf("%d\n",ans); }
return 0;
}
HDU 5091 线段树扫描线的更多相关文章
- hdu 5091(线段树+扫描线)
上海邀请赛的一道题目,看比赛时很多队伍水过去了,当时还想了好久却没有发现这题有什么水题的性质,原来是道成题. 最近学习了下线段树扫描线才发现确实是挺水的一道题. hdu5091 #include &l ...
- hdu 4052 线段树扫描线、奇特处理
Adding New Machine Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- hdu 1828 线段树扫描线(周长)
Picture Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU 5107 线段树扫描线
给出N个点(x,y).每一个点有一个高度h 给出M次询问.问在(x,y)范围内第k小的高度是多少,没有输出-1 (k<=10) 线段树扫描线 首先离散化Y坐标,以Y坐标建立线段树 对全部的点和询 ...
- hdu 1255(线段树 扫描线) 覆盖的面积
http://acm.hdu.edu.cn/showproblem.php?pid=1255 典型线段树辅助扫描线,顾名思义扫描线就是相当于yy出一条直线从左到右(也可以从上到下)扫描过去,此时先将所 ...
- hdu 1542 线段树+扫描线 学习
学习扫描线ing... 玄学的东西... 扫描线其实就是用一条假想的线去扫描一堆矩形,借以求出他们的面积或周长(这一篇是面积,下一篇是周长) 扫描线求面积的主要思想就是对一个二维的矩形的某一维上建立一 ...
- hdu 4419 线段树 扫描线 离散化 矩形面积
//离散化 + 扫描线 + 线段树 //这个线段树跟平常不太一样的地方在于记录了区间两个信息,len[i]表示颜色为i的被覆盖的长度为len[i], num[i]表示颜色i 『完全』覆盖了该区间几层. ...
- hdu 3265 线段树扫描线(拆分矩形)
题意: 给你n个矩形,每个矩形上都有一个矩形的空洞,所有的矩形都是平行于x,y轴的,最后问所有矩形的覆盖面积是多少. 思路: 是典型的矩形覆盖问题,只不过每个矩形上多了一个矩 ...
- HDU 1828 线段树+扫描线(计算矩形周长并)
题意:给你n个矩形,然后矩形有可能重叠,要你求周长 思路:首先碰到这种矩形在数轴上那么第一反应应该想到的是扫描线, 做周长我们有两种方法 第一种,我们可以分开两部分求,第一遍求x轴上的贡献,第二遍求y ...
随机推荐
- 新建一个类并绑定一个activity
1.新建一个类(.java 文件),继承Android.app.Activity 2.新建一个activity 文件 3.重写onCreate 方法,设置绑定activity 文件 @Override ...
- table边框不显示
今日在做报表的时候发现,最后一行隐藏后整个报表的下边框会不显示,猜测是td的边框隐藏后但table并未设置边框,导致下边框没有出现.因此设置了table边框后问题解决.table和td的边框关系如下实 ...
- poj 2653 计算几何
#include <iostream> #include <cstring> #include <algorithm> #include <cmath> ...
- Mac OS X Mavericks or Yosemite 安装Nginx、PHP、Mysql、phpMyAdmin
翻译:http://blog.frd.mn/install-nginx-php-fpm-mysql-and-phpmyadmin-on-os-x-mavericks-using-homebrew/ 最 ...
- 关于android源码中的APP编译时引用隐藏的API出现的问题
今天在编译android源码中的计算器APP时发现,竟然无法使用系统隐藏的API,比如android.os.ServiceManager中的API,引用这个类时提示错误,记忆中在android源码中的 ...
- uva Stacks of Flapjacks
Stacks of Flapjacks 题目链接:Click Here~ 题目描写叙述: ...
- CSDN Markdown简明教程3-表格和公式
0. 文件夹 文件夹 前言 表格 1 表格 2 表格对齐方式 公式 1 行内公式 2 陈列公式displayed formulas 3 MathJax语法 深入 声明 1. 前言 Markdown是一 ...
- js中赋值表达式的值为右边
var name="the window";var o={ name:"the object", getName:function(){ console.log ...
- Knockout快速扫盲
1.Knockout.js是什么? Knockout是一款很优秀的js库,它可以快速让你使用一个干净整洁的底层数据模型,即可创建一个富文本且具有良好显示和编辑功能的用户界面.任何时候你的ui需要自 ...
- 关于left join 和 inner join
今天遇到一个逻辑很复杂的SQL,虽然写出来了,但是并没有完全体会,找了找资料,算是摸清楚了left join和inner join 的实际意义. 感谢PCJIM的文章,写的非常明白,原文地址:http ...