POJ 2528 Mayor's posters 离散化和线段树题解
本题就是要往墙上贴海报,问最后有多少可见的海报。
事实上本题的难点并非线段树,而是离散化。
由于数据非常大,直接按原始数据计算那么就会爆内存和时间的。
故此须要把数据离散化。
比方有海报1 6 7 9 20 100 5 1000的原始数据。直接计算须要1-1000的内存,离散化之后仅仅须要8内存,由于仅仅有4组数据8个数。
本题更进一步高级一点的离散化就是须要把不相邻的两个数据插入一个数值。表示有空白的地方,不是全部海报都覆盖到的。
比方上面的数据要离散为:1 2 5 6 7 8 9 10 20 21 100 101 1000,中间插入了一些数值,这样才干保证数据正确。
比較难想出来的地方。须要好好考虑一下才干想通的。
看程序discreteArr是离散化之后的数据。使用这种数据处理就能够比原始数据少非常多数据了。
#include <stdio.h>
#include <cstring>
#include <algorithm>
using namespace std;
const int SIZE = 10005;
bool hashColor[SIZE];
int le[SIZE], ri[SIZE];
int discreteArr[SIZE<<2];//由于这里或许须要四倍的SIZE内存
int seg[SIZE<<4];
int visiblePosts; inline int lChild(int rt) { return rt<<1; }
inline int rChild(int rt) { return rt<<1|1; } inline void pushDown(int rt)
{
if (seg[rt])
{
seg[lChild(rt)] = seg[rChild(rt)] = seg[rt];
seg[rt] = 0;
}
} void build(int l, int r, int rt)
{
seg[rt] = 0;
if (l == r) return ;
int m = l + ((r-l)>>1);
build(l, m, lChild(rt));
build(m+1, r, rChild(rt));
} void update(int ql, int qr, int col, int l, int r, int rt)
{
if (ql <= l && r <= qr)
{
seg[rt] = col;
return;
}
pushDown(rt);
int m = l + ((r-l)>>1);
if (ql <= m) update(ql, qr, col, l, m, lChild(rt));
if (m < qr) update(ql, qr, col, m+1, r, rChild(rt));
} void query(int l, int r, int rt)
{
if (seg[rt])
{
if (!hashColor[seg[rt]])
{
visiblePosts++;
hashColor[seg[rt]] = true;
}
return ;
}
if (l == r) return ;//注意这里没有poster的时候
int m = l + ((r-l)>>1);
query(l, m, lChild(rt));
query(m+1, r, rChild(rt));
} int biSearch(int arr[], int key, int n)
{
int l = 1, r = n-1, m = -1;
while (l <= r)
{
m = l + ((r-l)>>1);
if (arr[m] < key) l = m+1;
else if (key < arr[m]) r = m-1;
else break;
}
return m;
} int main()
{
int T, n;
scanf("%d", &T);
while (T--)
{
scanf("%d", &n);
int disN = 1;
for (int i = 1; i <= n; i++)
{
scanf("%d %d", &le[i], &ri[i]);
discreteArr[disN++] = le[i];
discreteArr[disN++] = ri[i];
}
sort(discreteArr+1, discreteArr+disN); int j = 2;
for (int i = 2; i < disN; i++)
{
if (discreteArr[i] != discreteArr[i-1])
discreteArr[j++] = discreteArr[i];
}
for (int i = j-1; i > 1; i--)
{
if (discreteArr[i] != discreteArr[i-1] + 1)
discreteArr[j++] = discreteArr[i-1] + 1;
}
sort(discreteArr + 1, discreteArr + j);
build(1, j-1, 1);
for (int i = 1; i <= n; i++)
{
int ql = biSearch(discreteArr, le[i], j);
int qr = biSearch(discreteArr, ri[i], j);
update(ql, qr, i, 1, j-1, 1);
}
visiblePosts = 0;
memset(hashColor, 0, sizeof(bool) * (n+1));
query(1, j-1, 1);
printf("%d\n", visiblePosts);
}
return 0;
}
POJ 2528 Mayor's posters 离散化和线段树题解的更多相关文章
- POJ 2528 Mayor's posters 离散化+线段树
题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...
- poj 2528 Mayor's posters 【线段树 + 离散化】
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 50643 Accepted: 14675 ...
- 线段树区间更新,区间统计+离散化 POJ 2528 Mayor's posters
题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报.问最后从外面能看到几张不同的海报. 由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于 ...
- poj 2528 Mayor's posters
这个题意是市长竞选,然后每一个人都能够贴广告牌.能够覆盖别人的看最后剩几个广告牌 这题目想了两个多小时,最后忍不住看了一下题解. 发现仅仅是简单地hash 和线段树成段更新 由于有10000个人竞选 ...
- POJ-2528 Mayor's posters (离散化, 线段树)
题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...
- POJ 2482 Stars in Your Window 离散化+扫描法 线段树应用
遇见poj上最浪漫的题目..题目里图片以上几百词为一篇模板级英文情书.这情感和细腻的文笔深深地打动了我..不会写情书的童鞋速度进来学习.传送门 题意:坐标系内有n个星星,每个星星都有一个亮度c (1& ...
- poj 2528 Mayor's posters(线段树+离散化)
/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...
- poj 2528 Mayor's posters 线段树+离散化技巧
poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...
- POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)
POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...
随机推荐
- Docker可视化管理工具对比(DockerUI、Shipyard、Rancher、Portainer)
1.前言 谈及docker,避免不了需要熟练的记住好多命令及其用法,对于熟悉shell.技术开发人员而言,还是可以接受的,熟练之后,命令行毕竟是很方便的,便于操作及脚本化.但对于命令行过敏.非技术人员 ...
- hbase的几种访问方式
Hbase的访问方式 1.Native Java API:最常规和高效的访问方式: 2.HBase Shell:HBase的命令行工具,最简单的接口,适合HBase管理使用: 3.Thrift Gat ...
- [Puppeteer] Get a Page's Load Time with Puppeteer (window.profermence.timing)
In this lesson we are going to use Google's Puppeteer to gather metrics about a page's load time. We ...
- 黑马day14 过滤器概述&生命周期&运行过程
过滤器:当訪问一个web资源的时候,过滤器就在你訪问这个web资源的前进行拦截...在放行过后...filter过滤器也能够做一些其它的事情. 编写过滤器的步骤: 1.写一个过滤器类实现filter接 ...
- mariadb克隆
oracle有克隆安装,事实上mysql/mariadb相似.仅仅需简单几步就能够直接在异机直接启动. 环境: node01安装完毕的mariadb; node02一个新机器 如今将node01克隆到 ...
- node17
一.复习 cookie是在res中设置,req中读取的.第一次的访问没有cookie. cookie的存储大小有限,kv对.对用户可见,用户可以禁用.清除Cookie.可以被篡改. cookie用来制 ...
- 页面的URL分析----window.location.href
window.location是页面的位置对象window.location.href是 location的一个属性值,并且它是location的默认属性. window.location直接赋值一个 ...
- 10 quick tips for Redis
Redis is hot in the tech community right now. It's come a long way from being a small personal proje ...
- (转载) 百度地图工具类封装(包括定位,附近、城市、范围poi检索,反地理编码)
目录视图 摘要视图 订阅 赠书 | 异步2周年,技术图书免费选 程序员8月书讯 项目管理+代码托管+文档协作,开发更流畅 百度地图工具类封装(包括定位,附近.城市.范围poi检索, ...
- Java文件(io)编程——文件字节流的使用
案例1: 演示FileInputStream类的使用(用FileInputStream的对象把文件读入到内存) 首先要在E盘新建一个文本文件,命名为test.txt,输入若干字符 public cla ...