POJ 2528 Mayor's posters (离散化和线段树使用)
还是做了线段树的题目,玩了两天也要继续看看题目了。之前就有看离散化的概念,大家可以去百度百科一下,简单转载一个例子
离散化 的大概思路 : 比如说给你一组 数据 1 4 1000 100000, 如果直接
开线段, 显然是浪费, 那么我们只要 进行 映射 :
1 1
4 2
1000 3
100000 4
接下来 我们只要对 1 2 3 4 建立线段树就行了 只需要[1,4]的区间。
差不多就是这样了,这样就可以大大减少使用的内存空间。
这道题目的数据范围非常大1 <= li <= ri <= 10000000;直接开肯定爆掉的,而且光建树就浪费非常多的时间了,所以做离散化映射。因为1 <= n <= 10000,所以建树开四倍大空间就行,又以为一个输入数据两个点,所以是八倍空间。本题重点是离散化的使用,记得之前比赛题目就是这题,那时候还不会线段树,就无限尝试一直WA,现在终于解决了。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include<algorithm>
using namespace std;
struct NODE
{
int l,r,val;
}tree[80005];
struct node
{
int l,r;
}num[10001];
bool vis[10001];
int ans,lag[20001],n;
void build(int l,int r,int index) //建树
{
tree[index].l=l;
tree[index].r=r;
tree[index].val=0;
if(l==r)
return;
int mid=(l+r)/2;
build(l,mid,2*index);
build(mid+1,r,2*index+1);
}
int find(int x) //二分查找对应点
{
int l=0,r=n-1;
while(l<=r)
{
int mid=(l+r)/2;
if(lag[mid]==x)
return mid+1;
else
if(lag[mid]>x)
r=mid-1;
else
l=mid+1;
}
}
void update(int l,int r,int index,int c) //更新线段树,标记属于哪个宣传
{
if(l==tree[index].l && r==tree[index].r)
{
tree[index].val=c;
return;
}
if(tree[index].val>-1)
{
tree[2*index].val=tree[2*index+1].val=tree[index].val;
tree[index].val=-1;
}
int mid=(tree[index].l+tree[index].r)/2;
if(mid>=l && mid+1<=r)
{
update(l,mid,2*index,c);
update(mid+1,r,2*index+1,c);
}
else
if(r<=mid)
update(l,r,2*index,c);
else
if(l>=mid+1)
update(l,r,2*index+1,c);
}
void query(int l,int r,int index)
{
if(tree[index].val>-1) //询问的核心 满足条件的情况
{
int tc=tree[index].val;
if(!vis[tc] && tc)
{
vis[tc]=1;
ans++;
}
return;
}
int mid=(tree[index].l+tree[index].r)/2;
if(l<=mid && r>=mid+1)
{
query(l,mid,2*index);
query(mid+1,r,2*index+1);
}
else
if(r<=mid)
query(l,r,2*index);
else
if(l>=mid+1)
query(l,r,2*index+1);
}
int main()
{
int i,t,N,pre,l,r;
scanf("%d",&t);
while(t--)
{
memset(vis,0,sizeof(vis));
scanf("%d",&N);
for(i=0;i<N;i++) //输入数据做映射
{
scanf("%d%d",&num[i].l,&num[i].r);
lag[2*i]=num[i].l;
lag[2*i+1]=num[i].r;
}
sort(lag,lag+2*N);
n=pre=0;
for(i=0;i<2*N;i++) //去除相同数据
{
if(lag[i]!=pre)
{
pre=lag[i];
lag[n++]=lag[i];
}
}
build(1,n,1);
for(i=0;i<N;i++) //开始一个个点的更新
{
l=find(num[i].l);
r=find(num[i].r);
update(l,r,1,i+1);
}
ans=0;
query(1,n,1);
printf("%d\n",ans);
}
return 0;
}
转载于:https://www.cnblogs.com/littlex/archive/2012/02/04/2337970.html
POJ 2528 Mayor's posters (离散化和线段树使用)相关推荐
- POJ 2528 Mayor's posters 贴海报 线段树 区间更新
注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...
- POJ-2528 Mayor's posters (离散化, 线段树)
题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...
- poj 2528 Mayor's posters(线段树+离散化)
1 /* 2 poj 2528 Mayor's posters 3 线段树 + 离散化 4 5 离散化的理解: 6 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用 ...
- POJ 2528 Mayor's posters(线段树)
题目大意 贴海报.每张海报的高度都是一样的,唯独宽度不一样.每张海报只能占用整数倍的单位线段长度,贴了 n(n<=10000) 张海报之后,有几张能够看见(有一个角能看见这张海报也算被看见了)? ...
- 离散化/线段树 (POJ - 2528 Mayor's posters)
Mayor's posters https://vjudge.net/problem/POJ-2528#author=szdytom 线段树 + 离散化 讲解:https://blog.csdn.ne ...
- poj 2528 Mayor's posters(线段树 离散化 区间更新 贴海报)
这个题目本来对大神来说可能是水题, 对我就不行了,昨晚非折腾到下半夜一点 搞定, 并且可以总结出 ,只有把问题想清楚,或着看人家解题报告自己把问题和代码思路 搞清楚,才能谈的上调bug,否则 ...
- POJ - 2528 Mayor's posters(线段数+离散化)
题目链接:点击查看 题目大意:给定一个长度为1e7的墙,然后给出n张海报,每张海报都会占据墙上的一部分宽度,问按照给出的次序往墙上贴海报, 最后有几张海报能露出来(露出部分也算) 题目分析:线段树的区 ...
- poj 2528 Mayor's posters (线段树+离散化)
/*离散化+线段树由于 数据的输入最大是 10000000 ,直接用开数组肯点会超,所以要将起离散话,首先 ,我们存储输入的边,将其离散化,后面的就和一般的线段树一样可. */#include< ...
- POJ - 2528 Mayor's posters (浮水法+线段树/离散化+线段树)
题目链接 题意: n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 分析1 离散 ...
最新文章
- SQL Server2019数据库查询所有数据库名、表名、表结构、表字段、主键方法演示,执行sql提示对象名‘user_tab_columns‘、 ‘user_cons_columns‘ 无效问题解决
- 趣味编程:函数式链表的快速排序
- 来,带你鸟瞰 Java 中的并发框架!
- 分区和分片的区别_MySQL分区与分片的差异
- STM32F0xx_SPI读写(Flash)配置详细过程
- 在Docker中运行asp.net core 跨平台应用程序
- Java 删除集合中指定的元素
- gdb调试bin带参数
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_17-页面静态化-模板管理-GridFS研究-存文件...
- mouseover和mouseenter的区别?
- 浑水摸「YY」、「侠盗」苹果和辛巴的「麦乳精」|极客一周
- 渗透测试实习日记day1
- 二元二次方程例题_二元二次方程组 解法 例题精编版
- python re 替换_python字符串替换之re.sub()
- html tr行内样式左对齐,探索CSS单行文字居中,多行文字居左的实现方式
- 奇妙的裴波那契数列和黄金分割
- keil创建无启动文件及自定义.sct文件的工程
- 【BLE MESH】PB-ADV入网详解
- LTE与VOLTE基础知识(1)
- 测试开发 | 接口测试之HTTP 协议讲解
热门文章
- scala 模式匹配支持正则吗_Python3正则表达式——小白初学!最完整的教程没有之一...
- 远程桌面漏洞poc_【漏洞复现】CVE 2019-0708 漏洞利用
- php tesseract,PHP ocr:用Tesseract OCR进行文字识别
- 人人网 api2.0 java_API2.0文档
- 检查java_如何检查Java版本?
- java okhttp设置超时_Java OkHttpClient.setWriteTimeout方法代码示例
- vm虚拟机win10无法复制文件_远程桌面无法复制粘贴传输文件解决办法
- mysql查询无主键的表的方法:
- 学习笔记(07):MySQL数据库运维与管理-02-用户权限授予演示
- retrofit框架学习(二)----retrofit封装