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张海报,海报 ...
随机推荐
- js如何实现php的in_array()
var arr = [ 4, "Pete", 8, "John" ]; jQuery.inArray("John", arr); //3 j ...
- poi API大全
一. POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能. 二. HSSF概况 HSSF 是 ...
- java中 flush()方法的作用
flush() 是清空,而不是刷新啊.一般主要用在IO中,即清空缓冲区数据,就是说你用读写流的时候,其实数据是先被读到了内存中,然后用数据写到文件中,当你数据读完的时候不代表你的数据已经写完了,因为还 ...
- POJ 1715
同样是确定某位上的数,当确定某一位后,其后面的排列数是确定的,所以可以用除法和取余数的方法来确定这一位的值 #include <iostream> #include <cstdio& ...
- Markdown简单介绍和基本的语法
原文发表自我的个人站点 http://www.hainter.com/markdown.欢迎大家訪问,谢谢支持~ Markdown是一种语言,能够用于编写高质量的文章,语法简单易用 Markdown的 ...
- Android高级控件(一)——ListView绑定CheckBox实现全选,添加和删除等功能
Android高级控件(一)--ListView绑定CheckBox实现全选,添加和删除等功能 这个控件还是挺复杂的.也是项目中应该算是比較经常使用的了,所以写了一个小Demo来讲讲,主要是自己定义a ...
- Android自己定义组件系列【4】——自己定义ViewGroup实现双側滑动
在上一篇文章<Android自己定义组件系列[3]--自己定义ViewGroup实现側滑>中实现了仿Facebook和人人网的側滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布 ...
- Android 多分辨率自适应总结
这周的工作对Android项目多分辨率自适应进行调整.故对这方面知识进行不断的尝试学习.Android项目刚開始做的时候一定养成编程习惯,全部资源调用放在value中.统一命名以及管理.总结了下面内容 ...
- nyoj--1237--最大岛屿(dfs+数据处理)
最大岛屿 时间限制:1000 ms | 内存限制:65535 KB 难度: 描述 神秘的海洋,惊险的探险之路,打捞海底宝藏,激烈的海战,海盗劫富等等.加勒比海盗,你知道吧?杰克船长驾驶着自己的的战 ...
- Android 那些年,处理getActivity()为null的日子
在日常开发中的时候,我们经常会使用ViewPager+Fragment进行视图滑动,在某些部分逻辑也许我们需要利用上下文Context(例如基本的Toast),但是由于Fragment只是衣服在Act ...