本题就是要往墙上贴海报,问最后有多少可见的海报。

事实上本题的难点并非线段树,而是离散化。

由于数据非常大,直接按原始数据计算那么就会爆内存和时间的。

故此须要把数据离散化。

比方有海报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&#39;s posters 离散化和线段树题解的更多相关文章

  1. POJ 2528 Mayor&#39;s posters 离散化+线段树

    题目大意:给出一些海报和贴在墙上的区间.问这些海报依照顺序贴完之后,最后能后看到多少种海报. 思路:区间的范围太大,然而最多仅仅会有10000张海报,所以要离散化. 之后用线段树随便搞搞就能过. 关键 ...

  2. poj 2528 Mayor&#39;s posters 【线段树 + 离散化】

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 50643   Accepted: 14675 ...

  3. 线段树区间更新,区间统计+离散化 POJ 2528 Mayor&#39;s posters

    题意:有一个非常长的板子(10000000长),在上面贴n(n<=10000)张海报.问最后从外面能看到几张不同的海报. 由于板子有10000000长,直接建树肯定会爆,所以须要离散化处理,对于 ...

  4. poj 2528 Mayor&#39;s posters

    这个题意是市长竞选,然后每一个人都能够贴广告牌.能够覆盖别人的看最后剩几个广告牌 这题目想了两个多小时,最后忍不住看了一下题解. 发现仅仅是简单地hash  和线段树成段更新 由于有10000个人竞选 ...

  5. POJ-2528 Mayor's posters (离散化, 线段树)

    题目传送门: POJ-2528 题意就是在一个高度固定的墙面上贴高度相同宽度不同的海报,问贴到最后还能看到几张?本质上是线段树区间更新问题,但是要注意的是题中所给数据范围庞大,直接搞肯定会搞出问题,所 ...

  6. POJ 2482 Stars in Your Window 离散化+扫描法 线段树应用

    遇见poj上最浪漫的题目..题目里图片以上几百词为一篇模板级英文情书.这情感和细腻的文笔深深地打动了我..不会写情书的童鞋速度进来学习.传送门 题意:坐标系内有n个星星,每个星星都有一个亮度c (1& ...

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

    /* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 ...

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

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

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

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

随机推荐

  1. C/C++ 名正则言顺

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50532701 名称所表达的含义极其丰富 ...

  2. 2016 10 28考试 dp 乱搞 树状数组

    2016 10 28 考试 时间 7:50 AM to 11:15 AM 下载链接: 试题 考试包 这次考试对自己的表现非常不满意!! T1看出来是dp题目,但是在考试过程中并没有推出转移方程,考虑了 ...

  3. javascript-js中技巧集合

    1.值的转换 在JavaScript中,一共有两种类型的值:原始值(primitives)和对象值(objects).原始值有:undefined, null, 布尔值(booleans), 数字(n ...

  4. 改动购物项图书数量的Ajax处理

    一.cart.jsp页面 <%@ page language="java" contentType="text/html; charset=utf-8" ...

  5. 1067. Sort with Swap(0,*) (25)【贪心】——PAT (Advanced Level) Practise

    题目信息 1067. Sort with Swap(0,*) (25) 时间限制150 ms 内存限制65536 kB 代码长度限制16000 B Given any permutation of t ...

  6. cocos2d-x_AnchorPoint锚点

    锚点是定位和变换操作的一个重点.锚点我们能够看成用一根图钉将一张纸或者相片钉在墙上的那个点. 节点的位置是由我们设置的position和anchor point一起决定的. 值得一提的是,anchor ...

  7. swift学习第四章

    // Playground - noun: a place where people can play import UIKit var age=100 //假设年龄不大于50的就会在这里断言,和之前 ...

  8. hdu_2191多重背包

    用二维数组解的,因为忘了memset害我wa了好几发... #include<iostream> #include<cstdio> #include<cstring> ...

  9. BZOJ 2194 FFT

    思路: 题目中给的是差值一定的 那么就把b数组倒一下 不就变成 i+j=k(k为定值的了嘛) 嗯 然后搞个FFT //By SiriusRen #include <cstdio> #inc ...

  10. C# 位域[flags]

    .NET中的枚举我们一般有两种用法,一是表示唯一的元素序列,例如一周里的各天:还有就是用来表示多种复合的状态.这个时候一般需要为枚举加上[Flags]特性标记为位域,例如: [Flags]   enu ...