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张海报,海报 ...
随机推荐
- Spring boot 使用@Value注入属性
Spring boot 使用@Value注入属性 学习了:http://blog.csdn.net/hry2015/article/details/72353994 如果启动的时候报错: spring ...
- IOS假设将一个十六进制的color转换成UIColor,非常有用
UI给开发的效果图非常多时候标注着十六进制的Color,而程序中用到的往往是UIColor能够用例如以下方法去转换: (UIColor *)RGBColorFromHexString:(NSStrin ...
- 《UNIX环境高级编程》读书笔记之系统数据文件和信息(1)
1.UNIX系统口令文件包括了下图所看到的的各字段,这些字段包括在<pwd.h>中定义的passwd结构体中 POSIX定义了两个获取口令文件项的函数. 在给出用户登录名或用户ID后.这两 ...
- JS,Javascript加载与函数执行过程
Js,Javascript加载与函数执行过程 test.html <!DOCTYPE HTML> <html lang="en"> <head> ...
- c:\Windows\System32\drivers\etc\hosts的作用
c:\Windows\System32\drivers\etc\hosts 是域名解析文件. 可以直接用记事本打开.将IP地址重定向. 格式为:ip地址-空格-域名 可以将一个域名重新定向到一个IP ...
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- rsync来传输文件(可断点续传)
scp传文件的话如果出错就得重新来过, 用rsync可以实现断点上传的功能 大概就是这样用: rsync -P --rsh=ssh home.tar 192.168.205.34:/home/h ...
- 10.ref regex unordered_set smartpoint
ref引用不可以复制的对象 void print(std::ostream &os, int i) { os << i << endl; } //ref引用不可以复制的 ...
- 修改echarts环形图的牵引线及文字位置
修改echarts环形图的牵引线及文字位置,下面代码及效果不仅如此,也包含了其它的效果哦.有问题可以留言. 根据echarts官方示例修改效果: 官方示例图: 修改效果图: 直接上代码:其它不多说. ...
- javax.validation注解使用
@Pattern(regexp = "^[0-9]*$",message = "完成比例(进度)必须是数字")