poj(2528)——Mayor's posters(线段树+离散化)

POJ2528-Mayor's posters【区间映射压缩(离散化)+线段树】 POJ2528-Mayor's posters 【区间映射压缩(离散化)+线段树】 解题报告+AC代码 http://hi.youkuaiyun.com/!s/83XZJU ========> 我的所有POJ解题报告链接: http://blog.youkuaiyun.com/lyy289065406/article/details/6642573 立即下载

这道题目让我又重新认识了一下离散化:

首先总结一下离散化的特点:

1)有时区间的端点并不是整数,或者区间太大导致建树内存开销过大而MLE,那么就需要进行离散化后再建树。

2)意思是将区间范围很大的数据集映射到较小的数据集,这样建树更加有效,或者说我们只取需要的值来用。

这个意思说到底就是进行映射,把原来很大的映射到一个较小的空间中去。

题意:

给定一些海报,它们可能相互重叠,告诉你每个海报的宽度(它们的高度都是一样的)和先后的叠放次序,问没有被完全盖住的海报有多少张?

这里我们注意到了数据的范围:海报最多100000张,而墙的范围最大是10的7次。所以我们肯定不能以墙来建树。(而且这里海报都是完全覆盖每一个墙面的)

所以我们要把海报的左右端点进行离散化,也就是把原先很大的每个端点进行标号,把它转化为更小的数据

这里要注意一点就是:当它们之间距离等于1的时候,只要+1就可以了,但是当距离大于1的时候,那么要+2

原因:(来源于http://blog.youkuaiyun.com/non_cease/article/details/7383736)

解法:离散化,如下面的例子(题目的样例),因为单位1是一个单位长度,将下面的

      1   2   3   4  6   7   8   10

     —  —  —  —  —  —  —  —

      1   2   3   4  5   6   7   8

离散化  X[1] = 1; X[2] = 2; X[3] = 3; X[4] = 4; X[5] = 6; X[7] = 8; X[8] = 10

于是将一个很大的区间映射到一个较小的区间之中了,然后再对每一张海报依次更新在宽度为1~8的墙上(用线段树),最后统计不同颜色的段数。

但是只是这样简单的离散化是错误的,

如三张海报为:1~10 1~4 6~10

离散化时 X[ 1 ] = 1, X[ 2 ] = 4, X[ 3 ] = 6, X[ 4 ] = 10
第一张海报时:墙的1~4被染为1;
第二张海报时:墙的1~2被染为2,3~4仍为1;
第三张海报时:墙的3~4被染为3,1~2仍为2。
最终,第一张海报就显示被完全覆盖了,于是输出2,但实际上明显不是这样,正确输出为3。

新的离散方法为:在相差大于1的数间加一个数,例如在上面1 4 6 10中间加5(算法中实际上1,4之间,6,10之间都新增了数的)

X[ 1 ] = 1, X[ 2 ] = 4, X[ 3 ] = 5, X[ 4 ] = 6, X[ 5 ] = 10

这样之后,第一次是1~5被染成1;第二次1~2被染成2;第三次4~5被染成3

最终,1~2为2,3为1,4~5为3,于是输出正确结果3。


接下来就是使用线段树来查询已经标号好的区间了。

这里我们进行从后往前查找,这样前面贴上去的海报就不会被覆盖掉了。

插入一张海报时,如果发现它对应的瓷砖有一部分露出来,那么就说明该海报时可见的。


#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<math.h>
using namespace std;
#define maxn 10010
int l[maxn],r[maxn],x[maxn*2];
int hash[10000100];
struct node{
	int l,r;
	bool covered;
}tree[1000100];
void build(int v,int l,int r){
	tree[v].l=l;
	tree[v].r=r;
	tree[v].covered=false;
	if(l==r) return ;
	int mid=(tree[v].l+tree[v].r)>>1;
	int temp=v<<1;
	build(temp,l,mid);
	build(temp+1,mid+1,r);
}
bool query(int v,int l,int r){
	//如果v区间直接被覆盖的话,那么直接false,因为前面贴的是不可见的 
	if(tree[v].covered) return false;
	bool ff;
	if(tree[v].l==l&&tree[v].r==r){
		tree[v].covered=true;
		return true;
	}
	int mid=(tree[v].l+tree[v].r)>>1;
	int temp=v<<1;
	if(r<=mid) ff=query(temp,l,r);
	else if(l>mid) ff=query(temp+1,l,r);
	else{
		bool f1=query(temp,l,mid);
		bool f2=query(temp+1,mid+1,r);
		ff=f1||f2;		//只需要部分可见就可以了 
	}
	//当左右子节点都被覆盖时,父节点说明也已经是覆盖的了 
	if(tree[temp].covered&&tree[temp+1].covered){
		tree[v].covered=true;
	}
	return ff;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int n;
		scanf("%d",&n);
		memset(l,0,sizeof(l));
		memset(r,0,sizeof(r));
		memset(x,0,sizeof(x));
		memset(hash,0,sizeof(hash));
		int count=0;
		for(int i=1;i<=n;i++){
			scanf("%d%d",&l[i],&r[i]);
			x[count++]=l[i];
			x[count++]=r[i];
		}
		sort(x,x+count);
		count=unique(x,x+count)-x;
		int no=0;
		//这里相当于是离散化
		for(int i=0;i<count;i++){
			hash[x[i]]=no;
			if(i<count-1){
				if(x[i+1]-x[i]==1) no++;
				else no+=2;
			}
		}
		build(1,0,no);
		int res=0;
		for(int i=n;i>=1;i--){
			if(query(1,hash[l[i]],hash[r[i]])){
				res++;
			}
		}
		printf("%d\n",res);
	}
}

对于离散化还是需要多多理解与思考!

POJ2528-Mayor's posters 测试数据 POJ2528-Mayor's posters 测试数据。数据来源:Alberta Collegiate Programming Contest 2003.10.18 – 问题G 立即下载

相关推荐

基于 Quest 摄像头数据开发的原理介绍【Unity Meta Quest MR 开发教程】

比如想在识别到的现实物体上叠加虚拟物体,需要知道这个现实物体在 Unity 的世界坐标下的哪个位置,是带有 x,y,z 三个轴的数据的。而 WebCamTexture 捕捉到的图像只是个 2D 的平面,没有三维世界的深度信息,我们通过物体识别算法识别到的物体坐标只是在这个 2D 平面上的一个屏幕坐标,可以理解为 Quest 拍摄了一张照片,我们识别到这张照片上的某个像素点为需要识别的现实物体的中心。是不是看起来比较复杂?Quest 的相机访问功能是在安卓的。

qq_46044366的博客 2105

(POJ-2528)Mayor‘s posters(区间覆盖+离散化)

题目链接:https://vjudge.net/problem/POJ-2528 这道题问我们最后能看到多少张海报,如果正着想会比较麻烦,因为我们不确定当前的海报是否会被之后的海报所掩盖,但是我们可以肯定的是之后的海报一定不会被他之前的海报所掩盖,所以我们就可以倒着来贴海报,如果当前贴的海报能被看见,说明不会被之后的海报所遮挡,至于怎么查询是否被遮挡,这就是线段树的区间查询问题了。由于题目给的海报的边界比较大,数组无法直接存下,我们只需要存储他们的相对大小关系即可,所以我们需要用到离散化。 但是离散化时

AC__dream的博客 250

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

西门子触摸屏教程wincc flexible2008 sp5 Smart V3 V4中文版软件

liang007dudu的博客 1万+

线段树之离散化(POJ-2528)

线段树系列之离散化,介绍了离散化的步骤以及线段树离散化的应用。

月巴虫丰博客 1611

LwIP在国产MCU的落地实践:从协议栈优化到网络稳定性实战

本文详细介绍了LwIP协议栈在国产GD32F407 MCU上的移植与优化实践,涵盖硬件平台选择、驱动适配、协议栈调优和网络稳定性提升策略。通过内存管理优化、实时操作系统集成和性能测试,为工业物联网应用提供高可靠性网络通信解决方案,显著提升数据传输效率和系统稳定性。

m2n3b4v5c6的博客 270

Halcon dyn_threshold详解

dyn_threshold 原型 dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 功能 利用局部阈值分割图像 参数列表 OrigImage (input_object):原始图像 ThresholdImage (input_object):处理后图像(一般采用滤波处理) RegionDynThresh (output_object):分割后区域 Offset (input_control):灰

ZiLiangQin的博客 1万+

poj2528(线段树+离散化)

题目链接:https://vjudge.net/problem/POJ-2528 题意:在区间[1,1e7]内染色,依次染n(<=1e4)中颜色,给出每种颜色染色的范围,可重叠,求最终有多少种颜色。 思路:继续肝线段树。。被这题虐了一下午加一晚上QAQ。    首先要想到离散化,因为区间为1e7,直接做的话时间空间都做不到。但因为是区间,这里不能简单的离散化,比如1、5离散化为1、2是...

weixin_34279184的博客 252

瑞芯微RK809音频驱动

瑞芯微RV1126中的RK809音频驱动开发

m0_61899715的博客 5221

线段树 离散化

线段树是一个二叉查找树 线段树一般解决的问题是有关区间的动态修改和查询的问题。 首先要明确的是二叉查找树的性质,有点类似于二分查找的过程,可以仔细理解一下,下面说一下建立一棵树可以直接用数组来保存每个点,因为二叉树的性质,对于每个点来说,他的左孩子的编号是当前节点编号的二倍,表示为:rt<<2rt<<2,右孩子编号为其左孩子编号+1,表示为:rt<<1|1rt&...

lggg的博客 1001

2026年数学建模国赛论文排版规范:Word与LaTeX终极对比及模板

提前演练:不要等到比赛开始才第一次使用排版工具。至少在赛前一个月完成1-2篇模拟论文的全流程排版练习。建立检查清单:基于国赛规范制定排版检查清单,在提交前逐项核对——公式编号连续?图表引用准确?参考文献完整?页数不超限?善用模板但不止于模板:模板提供的是起点而非终点。根据自身需求调整宏包配置和样式参数,理解每一行配置的含义。关注评审体验:从评委的视角审视论文——重点内容是否突出?逻辑结构是否清晰?视觉层次是否合理?备份与容错:无论使用何种工具,建立多级备份机制。本地、云端、U盘各存一份,且定期保存历史版本。

YOLO 210

使用Google Earth Engine下载JRC全球水体数据

通过Google Earth Engine平台和提供的源代码,研究人员和水资源管理者可以方便地获取和利用这一重要的水资源监测数据集,从而开展相关的研究和决策支持工作。要使用Google Earth Engine下载JRC全球水体数据,首先需要在Google Earth Engine平台上进行注册和登录。JRC全球水体数据是由欧洲联合研究中心开发的高分辨率全球水体分类数据集,覆盖了整个地球的陆地和水域。下载完成后,你可以使用各种遥感数据处理软件来打开和分析这些数据,以满足不同的研究和应用需求。

LrlDebug的博客 1158

ACM算法训练【区间和·离散化】

离散化:适合条件什么是离散化:把值域大的数字的序列映射到从0开始的自然数数组里(无法开辟出值域那么大的数组)

大河之犬的博客 966

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

POJ.2528 Mayor’s posters (线段树 区间更新 区间查询 离散化)题意分析贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报。最多有10000张海报,海报左右坐标范围不超过10000000。 一看见10000000肯定就要离散化了,因为建树肯定是建不下。离散化的方法是:先存到一个数组里面,然后sort,之后unique去重,最后查他离散化的坐标lower_bo

Pengwill's Blog 332

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【离散化+线段树】POJ 2528 Mayor's posters

POJ 2528 Mayor’s posters 题意: 在一个长度为1e7的墙上贴海报。n(<=1e4)张海报贴上去,海报可能会出现覆盖,贴完所有的海报之后能看见多少张(能看见一部分也算)海报。给出的海报信息是从第一张到最后一张(也就是贴的顺序)。 思路: 首先海报的位置可以是1-1e7间的任意位置,所以我们需要离散化一下。 关于离散化: 1. 左右位置2n个数去重排序后,如果前后两...

L_X_ 235

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

POJ 2528 Mayor's posters 线段树+离散化

Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city counci

MetalSeed 4791

POJ2528:Mayor's posters(线段树区间更新+离散化)

Description The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council

ACM!荣耀之路! 7869

poj 2528 Mayor's posters 线段树+离散化技巧

poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) 假设给出: 1~10 1~4 7-10 最后可以看见三张海报 如果离散化的时候不注意,就会变成 1 4 7 10(原始) 1 2 3 4 (离散化) 转化为: 1~4 1~2 3~4 这...

ddqb3235的博客 208

poj 2528 Mayor's posters 线段树+离散化

题意: 有一个100000000长的墙,现在要到墙上贴一些海报,因为贴的时候可以覆盖所以问最后你可以看见多少张海报(不要求完整的海报,有一个部分没被覆盖那么 就认为可以看见这个海报) 其中海报最多10000张 海报有2个数据 它贴在墙上的左端点值l和右端点值r 其中 110000000 数据的输入格式  先给出 T 情况的种数,再给出每一种情况的海报数量N 然后给出N张海报的数据,ok,题意

柯安的专栏 1023

[poj 2528] Mayor's posters 线段树+离散化

Mayor’s posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 54922 Accepted: 15935Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor

ATOD 613

【线段树_离散化_染色问题】POJ 2528 Mayor's posters

POJ 2528 Mayor's posters 题意: 在一个长度为1e7的墙上贴海报。n(<=1e4)张海报贴上去,海报可能会出现覆盖,问:贴完所有的海报之后能看见多少张(能看见一部分也算)海报。给出的海报信息是从第一张到最后一张(也就是贴的顺序)。 思路: 线段树染色问题。 区间数据范围过大,离散化。【注意因为是区间,所以离散化的时候要注意两个数据是不是...

L_X_ 360

离散化/线段树 (POJ - 2528 Mayor's posters)

题目链接 对于这个题,网上的很多题解对离散化的过程基本是一笔带过,本蒻苟看了很久才懂。现在在这详细讲一下这个题区间的离散化。 首先,看下面这个例子(几个区间): [1, 5] [2, 7] [8, 10] 在数组上表示: 这是咱们发现一个事实:对于这些区间,我们保留某些点的信息是没有意义的,比如:3,4,6,9。对于这些点,它们一直被包含在一个大区间里。所以,我们考虑把这些点压缩点,你可以想...

平凡人Kalzn的博客 1278

poj2528 Mayor's posters(线段树,离散化)

离散化的思想: 对于这样的数据 (3,10000), (9,1000000), (5,100000), (1,1000), (7,1000000) 我们可以将其处理为 (2,7), (5,9), (3,8), (1,6), (4,9) 我们再对离散化之后的数据进行处理就行了。 题目意思: n(n 求出最后还能看见多少张海报。 参考代码:

Jinbao 973

POJ 2528 Mayor's posters 线段树和离散化

POJ 2528 Mayor's posters线段树和离散化

NNDXNM的专栏 668
上一篇: hdu(5389)——Zero Escape(01背包变形)
下一篇: hdu(1114)——Piggy-Bank(完全背包)
ACMer_hades
博客等级 码龄12年 49粉丝 218原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值