题意:有n(1~10000)个市长的候选人,这个城市专门为他们安排了一个长为10000000的墙,他们每人可以按顺序帖自己的竞选海报到墙上,所有的海报与墙一样高,分别帖在墙的[a[i],b[i]]区间上。问最后能露出来被看到的海报有多少张。
思路:线段树+离散化。由于长度太大,无法直接建树,而n最大只有10000,故因考虑离散化。
例:区间[1,6], [1,7], [2,10], [8,18]
离散化后的结果为:区间[1,3], [1,4], [2,6], [5,7]。
很明显,会节约了很多的空间,但是每个区间的覆盖关系不会改变,这点是最关键的。
另外,至于判断每一个有没有露出来的空间,方法为:从后往前帖,先帖到的区间就是用过的,然后如果有一张海报帖到的区间都是用过的,则说明它不能露出来了。
代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int Max = 25000;
struct
{
int l, r;
bool vis;
}node[3*Max];
struct data
{
int pos, num;
}post[Max];
bool flag;
bool cmp1(data &a, data &b)
{
if(a.pos < b.pos)
return true;
return false;
}
bool cmp2(data &a, data &b)
{
if(a.num > b.num)
return true;
if(a.num == b.num && a.pos < b.pos)
return true;
return false;
}
void BuildTree(int left, int right, int u)
{ // 建树。
node[u].l = left;
node[u].r = right;
node[u].vis = false;
if(left == right)
return;
int mid = (left+right)>>1;
BuildTree(left, mid, u<<1);
BuildTree(mid+1, right, (u<<1)+1);
}
void query(int left, int right, int u)
{ // 查询。
if(node[u].vis == true)
return;
if(node[u].l == left && node[u].r == right)
{
node[u].vis = true; // 修改。
flag = true; // 对于新帖的海报,有区间可以让其露出来。
return;
}
if(right <= node[u<<1].r)
query(left, right, u<<1);
else if(left >= node[(u<<1)+1].l)
query(left, right, (u<<1)+1);
else
{
query(left, node[u<<1].r, u<<1);
query(node[(u<<1)+1].l, right, (u<<1)+1);
}
// *递归回来的时候,由于左右子结点性质的改变,必须对父结点信息进行相应的更改。
node[u].vis = node[u<<1].vis & node[(u<<1)+1].vis;
}
int main()
{
int t, n, i;
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = 0; i < n; i ++)
{
scanf("%d%d", &post[2*i].pos, &post[2*i+1].pos);
post[2*i].num = post[2*i+1].num = i;
}
sort(post, post + 2*n, cmp1);
int k = 0, pre = 0; // 离散化。
for(i = 0; i < 2*n; i ++)
{
if(post[i].pos != pre)
{
pre = post[i].pos;
post[i].pos = ++ k;
}
else post[i].pos = k;
}
BuildTree(1, k, 1);
sort(post, post + 2*n, cmp2); // 按贴的顺序从后往前排。
int ans = 0;
for(i = 0; i < 2*n; i += 2)
{
int left = post[i].pos;
int right = post[i+1].pos;
flag = false;
query(left, right, 1);
if(flag)
ans ++;
}
printf("%d\n", ans);
}
return 0;
}
分享到:
相关推荐
【标题】"POJ2528-Mayor's posters"是一个经典的编程竞赛题目,源自2003年Alberta Collegiate Programming Contest。该比赛每年都会吸引众多编程爱好者参加,旨在锻炼参赛者的算法设计和实现能力。题目“市长的海报...
POJ2528-Mayor's posters 【区间映射压缩(离散化)+线段树】 解题报告+AC代码 http://hi.csdn.net/!s/83XZJU ========> 我的所有POJ解题报告链接: http://blog.csdn.net/lyy289065406/article/details/6642573
【标题】"poj-2528 Mayor's posters 测试数据及答案"涉及的是一个编程竞赛中的问题,这个问题来源于POJ(Programming Online Judge)平台,编号为2528。POJ是一个在线的编程练习系统,它提供了一系列的问题供程序员...
* 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * 树状树组:例如 poj1195、poj3321。 * RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 ...
- 线段树:如`poj2528, poj2828`。 - RMQ(区间查询):如`poj3264, poj3368`。 - 并查集的高级应用:如`poj1703, poj2492`。 - **搜索** - 最优化剪枝和可行性剪枝:如`poj3411, poj1724`。 - **动态规划** ...
10. **POJ 2528 线段树.txt**:这是第三个线段树相关的题目,解题报告可能会深入讲解线段树在不同场景下的应用。 通过阅读这些解题报告,你可以学习到各种高级算法的应用,如动态规划、搜索算法、数据结构(如线段...
- (poj2528, poj2828, poj2777, poj2886, poj2750):一种高效的数据结构,用于区间求和等操作。 2. **分块**: - (poj2482, poj2352):将数据分为多个区块,提高查询效率。 3. **树套树**: - (poj1195, poj...
poj2528、poj2777等是线段树的题目,poj2482、poj2352等涉及平衡树,poj1195、poj3321则训练了树状数组。 5. **搜索算法的优化**:poj1699、poj3411等训练搜索技巧和剪枝方法,poj3373、poj1691则介绍了记忆化搜索。...
- POJ 2528、POJ 2828:栈的基本操作与应用场景。 #### 队列 - **题目示例**: - POJ 2777、POJ 2886:队列的应用。 #### 树状数组 - **题目示例**: - POJ 3264、POJ 3368:树状数组的构造与更新。 #### 字符...
### ACM新手刷题攻略之POJ ... - 推荐题目:[poj2528](https://vjudge.net/problem/POJ-2528)、[poj2828](https://vjudge.net/problem/POJ-2828)、[poj2777](https://vjudge.net/problem/POJ-2777)、[poj2886]...
1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, poj2886, poj2750)。 2. **平衡树**:如AVL树、红黑树等(poj2482, poj2352)。 3. **并查集**:用于处理不相交集合的问题(poj1195, poj...
+ poj2528, poj2828, poj2777, poj2886, poj2750 * 静态二叉检索树 + poj2482, poj2352 * 树状树组 + poj1195, poj3321 * RMQ + poj3264, poj3368 * 并查集的高级应用 + poj1703, poj2492 * KMP算法 + poj1961...
ACM大赛准备课程总结 本文总结了参加ACM大赛需要准备的课程,...4. poj2528、poj2828、poj2777、poj2886、poj2750 通过学习和掌握这些知识点,可以帮助你更好地准备ACM大赛,并提高自己的编程能力和解决问题的能力。
- 示例题目:poj2528, poj2828, poj2777, poj2886, poj2750 - **树状数组** - 示例题目:poj2482, poj2352 - **并查集** - 示例题目:poj1195, poj3321 - **区间查询(RMQ)** - 示例题目:poj3264, poj3368 ...
- 示例题目:POJ 2528, POJ 2828, POJ 2777, POJ 2886, POJ 2750 - **二分法**:在特定区间内进行搜索,适用于求解数值优化问题。 - 示例题目:POJ 2031, POJ 1039 ##### 5. 数学问题 - **组合数学**:涉及排列...
- **示例题目**: POJ 3267, POJ 1836, POJ 1260, POJ 2533, POJ 3176, POJ 1080, POJ 1159 - **注意事项**: 理解每种模型的状态定义和转移方程。 #### 六、数学 **1. 组合数学** - **定义**: 研究组合结构的...
1. **高级数据结构**(如poj2528, poj2828, poj2777, poj2886, poj2750):包括线段树、树状数组、Trie树等,用于解决复杂的数据查询和更新问题。 2. **平衡树**(如poj2482, poj2352):如AVL树、红黑树等,保持树...
- poj2528: 涉及线段树的应用。 ##### 2. 静态二叉检索树 - **定义**: 静态二叉检索树是一种用于排序和查找操作的二叉树结构。 - **应用场景**: 在需要快速查找和排序的场景下应用广泛。 - **示例题目**: - poj...
- **POJ 2528**:这是一道稍微复杂一点的线段覆盖问题,需要使用离散化技术。题目中的输入数据范围可能很大,直接存储会消耗大量的内存空间。因此,首先需要对所有涉及的点进行离散化处理,压缩点的范围,减少所需的...
第十一类是线段树,涵盖了至少两个题目,包括 2352 和 2528 等题目。 第十二类是计算几何,涵盖了至少两个题目,包括 1113 和 1922 等题目。 第十三类是高精度,涵盖了至少三个题目,包括 1001 和 1413 等题目。 ...