热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

poj2528Mayor'sposters

*题意:往区间[1,10000000]的墙上贴海报,海报数量

/*

题意:往区间[1,10000000]的墙上贴海报&#xff0c;海报数量<&#61;10000&#xff0c;
海报之间彼此可以覆盖&#xff0c;问最后能看到的海报数量。

考虑到区间太大,直接线段树无疑会MLE,所以要对其离散化&#xff0c;再用线段树。
基本做法是先对所有端点坐标进行排序&#xff0c;用相应序号代替端点坐标构造线段树进行计算。
这样最大的序号也只是2*10000&#xff0c;这样就减少了没必要的搜索的时间和内存空间。
同时为了提高效率&#xff0c;采取倒插入的方式&#xff0c;即从数据的最后一行开始处理&#xff0c;在插入的同时进行判断。
在统计覆盖的时候&#xff0c;采用倒插入的方式从树的根开始进行统计

*/


#include // 线段树&#43;离散化
#include

using namespace std;
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
struct segment
{
int l,r;
int cover; //该区间已被覆盖的长度
}tree[80000];


int origin[80000][2]; //原始输入数据
bool vis[10000010]; //标记origin数组的元素是否已被处理

int arr[80000]; //离散化前的元素记录
int Hash[10000010]; //离散化后的元素记录

void BuildTree(int n,int s,int t)
{
tree[n].l&#61;s;
tree[n].r&#61;t;
tree[n].cover&#61;0;
if(s
{
int mid&#61;(s&#43;t)/2;
BuildTree(2*n,s,mid);
BuildTree(2*n&#43;1,mid&#43;1,t);
}
}

int insert(int n,int s,int t) //若在范围[s,t]内可以找到空白的区域,则这张海报是可见的&#xff0c;返回1
{

if(tree[n].cover&#61;&#61;tree[n].r-tree[n].l&#43;1) //区间已全部被覆盖
{

return 0;
}
else //区间还有尚未被覆盖的地方
{

if(s&#61;&#61;tree[n].l&&t&#61;&#61;tree[n].r) //参数刚好是整个区间,所以肯定可以找到尚未被覆盖的地方
{

tree[n].cover&#61;tree[n].r-tree[n].l&#43;1;
return 1;
}
else //参数不是整个区间&#xff0c;则要继续搜索孩子结点
{

int ok&#61;0;
int mid&#61;(tree[n].l&#43;tree[n].r)>>1;
if(t<&#61;mid)
{
if(insert(2*n,s,t)) //继续搜索左孩子
ok&#61;1;

}
else if(s>&#61;mid&#43;1)
{
if(insert(2*n&#43;1,s,t)) //继续搜索右孩子
ok&#61;1;

}
else //区间横跨左右孩子,分段搜索左右孩子
{

if(insert(2*n,s,mid)) //找到任何一段空白的都可以
ok&#61;1;

if(insert(2*n&#43;1,mid&#43;1,t))
ok&#61;1;
}
tree[n].cover&#61;tree[2*n].cover&#43;tree[2*n&#43;1].cover; //更新覆盖情况
return ok;

}
}
}

int main()
{
int cases,i;
scanf("%d",&cases);
while(cases--)
{
int num,rear&#61;0;
scanf("%d",&num);
for(i&#61;1;i<&#61;num;&#43;&#43;i)
{
scanf("%d%d",&origin[i][0],&origin[i][1]);
if(!vis[origin[i][0]]) //保证arr数组中元素惟一
{

arr[&#43;&#43;rear]&#61;origin[i][0];
vis[origin[i][0]]&#61;true;
}
if(!vis[origin[i][1]])
{
arr[&#43;&#43;rear]&#61;origin[i][1];
vis[origin[i][1]]&#61;true;
}
}
qsort(arr&#43;1,rear,sizeof(arr[1]),cmp); //升序排序

//离散化过程
for(i&#61;1;i<&#61;rear;&#43;&#43;i)

{
vis[arr[i]] &#61; false; //重新对vis数组置为false
Hash[arr[i]]&#61;i;

}
BuildTree(1,1,rear); //离散化后结点下标[1-rear]
int ans&#61;0;

for(i&#61;num;i>&#61;1;--i)
{
if(insert(1,Hash[origin[i][0]],Hash[origin[i][1]]))
ans&#43;&#43;;
}
printf("%d\n",ans);
}
return 0;
}


转:https://www.cnblogs.com/mjc467621163/archive/2011/07/20/2112210.html



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文探讨了 C++ 中普通数组和标准库类型 vector 的初始化方法。普通数组具有固定长度,而 vector 是一种可扩展的容器,允许动态调整大小。文章详细介绍了不同初始化方式及其应用场景,并提供了代码示例以加深理解。 ... [详细]
  • 本文介绍如何使用Objective-C结合dispatch库进行并发编程,以提高素数计数任务的效率。通过对比纯C代码与引入并发机制后的代码,展示dispatch库的强大功能。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 本文探讨了如何在模运算下高效计算组合数C(n, m),并详细介绍了乘法逆元的应用。通过扩展欧几里得算法求解乘法逆元,从而实现除法取余的计算。 ... [详细]
  • This document outlines the recommended naming conventions for HTML attributes in Fast Components, focusing on readability and consistency with existing standards. ... [详细]
author-avatar
qq7654ijh_416
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有