`

poj 2528

 
阅读更多

题意:有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 测试数据

    【标题】"POJ2528-Mayor's posters"是一个经典的编程竞赛题目,源自2003年Alberta Collegiate Programming Contest。该比赛每年都会吸引众多编程爱好者参加,旨在锻炼参赛者的算法设计和实现能力。题目“市长的海报...

    POJ2528-Mayor's posters【区间映射压缩(离散化)+线段树】

    POJ2528-Mayor's posters 【区间映射压缩(离散化)+线段树】 解题报告+AC代码 http://hi.csdn.net/!s/83XZJU ========&gt; 我的所有POJ解题报告链接: http://blog.csdn.net/lyy289065406/article/details/6642573

    poj-2528 Mayor's posters 测试数据及答案

    【标题】"poj-2528 Mayor's posters 测试数据及答案"涉及的是一个编程竞赛中的问题,这个问题来源于POJ(Programming Online Judge)平台,编号为2528。POJ是一个在线的编程练习系统,它提供了一系列的问题供程序员...

    poj题目分类

    * 线段树:例如 poj2528、poj2828、poj2777、poj2886、poj2750。 * 静态二叉检索树:例如 poj2482、poj2352。 * 树状树组:例如 poj1195、poj3321。 * RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 ...

    poj训练计划.doc

    - 线段树:如`poj2528, poj2828`。 - RMQ(区间查询):如`poj3264, poj3368`。 - 并查集的高级应用:如`poj1703, poj2492`。 - **搜索** - 最优化剪枝和可行性剪枝:如`poj3411, poj1724`。 - **动态规划** ...

    POJ 部分题解 解题报告

    10. **POJ 2528 线段树.txt**:这是第三个线段树相关的题目,解题报告可能会深入讲解线段树在不同场景下的应用。 通过阅读这些解题报告,你可以学习到各种高级算法的应用,如动态规划、搜索算法、数据结构(如线段...

    acm训练计划(poj的题)

    - (poj2528, poj2828, poj2777, poj2886, poj2750):一种高效的数据结构,用于区间求和等操作。 2. **分块**: - (poj2482, poj2352):将数据分为多个区块,提高查询效率。 3. **树套树**: - (poj1195, poj...

    acm poj300题分层训练

    poj2528、poj2777等是线段树的题目,poj2482、poj2352等涉及平衡树,poj1195、poj3321则训练了树状数组。 5. **搜索算法的优化**:poj1699、poj3411等训练搜索技巧和剪枝方法,poj3373、poj1691则介绍了记忆化搜索。...

    经典 的POJ 分类

    - POJ 2528、POJ 2828:栈的基本操作与应用场景。 #### 队列 - **题目示例**: - POJ 2777、POJ 2886:队列的应用。 #### 树状数组 - **题目示例**: - POJ 3264、POJ 3368:树状数组的构造与更新。 #### 字符...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ ... - 推荐题目:[poj2528](https://vjudge.net/problem/POJ-2528)、[poj2828](https://vjudge.net/problem/POJ-2828)、[poj2777](https://vjudge.net/problem/POJ-2777)、[poj2886]...

    ACM-POJ 算法训练指南

    1. **高级数据结构**:如树状数组、线段树(poj2528, poj2828, poj2777, poj2886, poj2750)。 2. **平衡树**:如AVL树、红黑树等(poj2482, poj2352)。 3. **并查集**:用于处理不相交集合的问题(poj1195, poj...

    ACM常用算法及其相应的练习题.docx

    + poj2528, poj2828, poj2777, poj2886, poj2750 * 静态二叉检索树 + poj2482, poj2352 * 树状树组 + poj1195, poj3321 * RMQ + poj3264, poj3368 * 并查集的高级应用 + poj1703, poj2492 * KMP算法 + poj1961...

    参加ACM大赛应该准备哪些课程? (2).pdf

    ACM大赛准备课程总结 本文总结了参加ACM大赛需要准备的课程,...4. poj2528、poj2828、poj2777、poj2886、poj2750 通过学习和掌握这些知识点,可以帮助你更好地准备ACM大赛,并提高自己的编程能力和解决问题的能力。

    ACM 题型

    - 示例题目:poj2528, poj2828, poj2777, poj2886, poj2750 - **树状数组** - 示例题目:poj2482, poj2352 - **并查集** - 示例题目:poj1195, poj3321 - **区间查询(RMQ)** - 示例题目:poj3264, poj3368 ...

    ACM 新手指南 PKU 题目分类

    - 示例题目: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. 组合数学** - **定义**: 研究组合结构的...

    ACM算法总结--最新总结的ACM算法

    1. **高级数据结构**(如poj2528, poj2828, poj2777, poj2886, poj2750):包括线段树、树状数组、Trie树等,用于解决复杂的数据查询和更新问题。 2. **平衡树**(如poj2482, poj2352):如AVL树、红黑树等,保持树...

    ACM北大训练

    - poj2528: 涉及线段树的应用。 ##### 2. 静态二叉检索树 - **定义**: 静态二叉检索树是一种用于排序和查找操作的二叉树结构。 - **应用场景**: 在需要快速查找和排序的场景下应用广泛。 - **示例题目**: - poj...

    线段树题目

    - **POJ 2528**:这是一道稍微复杂一点的线段覆盖问题,需要使用离散化技术。题目中的输入数据范围可能很大,直接存储会消耗大量的内存空间。因此,首先需要对所有涉及的点进行离散化处理,压缩点的范围,减少所需的...

    ACM 比赛 POJ的训练计划,,,非常不错,关键在于坚持

    第十一类是线段树,涵盖了至少两个题目,包括 2352 和 2528 等题目。 第十二类是计算几何,涵盖了至少两个题目,包括 1113 和 1922 等题目。 第十三类是高精度,涵盖了至少三个题目,包括 1001 和 1413 等题目。 ...

Global site tag (gtag.js) - Google Analytics