poj2528-Mayor's posters

Mayor's posters


Time Limit: 1000MS


 


Memory Limit: 65536K


Total Submissions: 41092


 


Accepted: 11949

Description

The citizens of Bytetown, AB, could not stand that the candidates in the mayoral election campaign have been placing their electoral posters at all places at their whim. The city council has finally
decided to build an electoral wall for placing the posters and introduce the following rules:

  • Every candidate can place exactly one poster on the wall.
  • All posters are of the same height equal to the height of the wall; the width of a poster can be any integer number of bytes (byte is the unit of length in Bytetown).
  • The wall is divided into segments and the width of each segment is one byte.
  • Each poster must completely cover a contiguous number of wall segments.

They have built a wall 10000000 bytes long (such that there is enough place for all candidates). When the electoral campaign was restarted, the candidates were placing their posters on the wall and their posters differed
widely in width. Moreover, the candidates started placing their posters on wall segments already occupied by other posters. Everyone in Bytetown was curious whose posters will be visible (entirely or in part) on the last day before elections.
Your task is to find the number of visible posters when all the posters are placed given the information about posters' size, their place and order of placement on the electoral wall.

Input

The first line of input contains a number c giving the number of cases that follow. The first line of data for a single case contains number 1 <= n <= 10000. The subsequent n lines describe the posters
in the order in which they were placed. The i-th line among the n lines contains two integer numbers li and ri which are the number of the wall segment occupied by the left end and the right end of the i-th poster, respectively. We know that for
each 1 <= i <= n, 1 <= li <= ri <= 10000000. After the i-th poster is placed, it entirely covers all wall segments numbered li, li+1 ,... , ri.

Output

For each input data set print the number of visible posters after all the posters are placed.

The picture below illustrates the case of the sample input.

 

Sample Input

1

5

1 4

2 6

8 10

3 4

7 10

Sample Output

4

Source

Alberta Collegiate Programming Contest 2003.10.18

 

 

 

 

思路:离散化+线段树

AC代码:

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int n;
struct CPost
{
   int L,R;
};
CPost posters[10100];//用来存放海报的两个端点的结构体数组;
int x[20200];//海报的端点瓷砖编号
int hash[10000010];//hash[i]表示瓷砖i所处的离散化后的区间编号
struct CNode
{
   int L,R;
   bool bCovered;//区间[L,R]是否已经被完全覆盖
   CNode *pLeft,*pRight;
};
CNode Tree[1000000];//存放海报区间的线段树
int nNodeCount=0;//结构体指针下标
int Mid(CNode *pRoot)
{
   return (pRoot->L+pRoot->R)/2;
}
void BuildTree(CNode *pRoot,int L,int R)
{
   pRoot->L=L;
   pRoot->R=R;
   pRoot->bCovered=false;
   if(L==R)
     return;
   nNodeCount++;
   pRoot->pLeft=Tree+nNodeCount;
   nNodeCount++;
   pRoot->pRight=Tree+nNodeCount;
   BuildTree(pRoot->pLeft,L,(L+R)/2);
   BuildTree(pRoot->pRight,(L+R)/2+1,R);
}
bool Post(CNode *pRoot,int L,int R)
{/*插入一张正好覆盖区间[L,R]的海报,返回ture说明区间[L,R],是部分
或全部可见的 */
   if(pRoot->bCovered) return false;//如果该部分已经被完全覆盖,返回false
   /*如果该部分没有被完全覆盖,则完全覆盖此部分 ,并返回ture说明 插入的海报是部分
或全部可见的*/
   if(pRoot->L==L&&pRoot->R==R){
        pRoot->bCovered=true;
        return true;
   }
   //没有找到海报区间要继续寻找
   bool bResult;
   if(R<=Mid(pRoot))
        bResult=Post(pRoot->pLeft,L,R);
   else if(L>=Mid(pRoot)+1)
        bResult=Post(pRoot->pRight,L,R);
   else{
        bool b1=Post(pRoot->pLeft,L,Mid(pRoot));
        bool b2=Post(pRoot->pRight,Mid(pRoot)+1,R);
        bResult=b1||b2; //只要有true的,最终都是true
   }
   //要更新根节点的覆盖情况
   if(pRoot->pLeft->bCovered&&pRoot->pRight->bCovered)
         pRoot->bCovered=true;
   return bResult;

}
int main()
{
    int i,j,k,t;
    scanf("%d",&t);
    int nCaseNo=0;
    while(t--)
    {
       nCaseNo++;
       scanf("%d",&n);
       int nCount=0;
       for(i=0;i<n;i++)
       {
          scanf("%d%d",&posters[i].L,&posters[i].R);
          x[nCount++]=posters[i].L;
          x[nCount++]=posters[i].R;
       }
       sort(x,x+nCount);
       nCount=unique(x,x+nCount)-x;//去掉重复元素
       //下面离散化
       int nIntervalNo=0;
       for(i=0;i<nCount;i++)
       {
          hash[x[i]]=nIntervalNo;
          if(i<nCount-1)
          {
             if(x[i+1]-x[i]==1)
                nIntervalNo++;
             else
                nIntervalNo+=2;
          }
       } 

       BuildTree(Tree,0,nIntervalNo);
       int nSum=0;
       for(i=n-1;i>=0;i--)
       {
          if(Post(Tree,hash[posters[i].L],hash[posters[i].R]))
          nSum++;
       }
       printf("%d\n",nSum);
    }
    return 0;
}
时间: 2024-10-27 20:52:56

poj2528-Mayor&#39;s posters的相关文章

poj 2528 Mayor&#039;s posters(线段树+离散化)

/* poj 2528 Mayor's posters 线段树 + 离散化 离散化的理解: 给你一系列的正整数, 例如 1, 4 , 100, 1000000000, 如果利用线段树求解的话,很明显 会导致内存的耗尽.所以我们做一个映射关系,将范围很大的数据映射到范围很小的数据上 1---->1 4----->2 100----->3 1000000000----->4 这样就会减少内存一些不必要的消耗 建立好映射关系了,接着就是利用线段树求解 */ #include<ios

poj 2528 Mayor&#039;s posters

点击打开链接poj2528 思路:离散化+线段树成段更新 分析: 1 首先这一题的数据是错误的,这题的区间的最大值为10000000,如果我们按照正常的线段树的思路去做的话肯定是会超内存和超时的. 2 所以我们应该考虑离散化,我们把区间离散成集中的区间.但是这个地方会有个问题 给出下面两个简单的例子应该能体现普通离散化的缺陷: 例子一:1-10 1-4 5-10 例子二:1-10 1-4 6-10 普通离散化后都变成了[1,4][1,2][3,4] 线段2覆盖了[1,2],线段3覆盖了[3,4]

php 解决MySQL插入数据出现 Incorrect string value: &amp;amp;#39;\xF0\x9F\x92\x8BTi...&amp;amp;#39;错误

在项目中向MySQL插入数据时,发现数据插入不完整,通过调试,发现插入语句也没什么特殊的错误.但是就是差不进去,于是就打开mysqli错误的调试 $ret = mysqli_query($this->conn, $sql) or die(mysqli_error($this->conn)); 结果弹出如下错误信息: Incorrect string value: '\xF0\x9F\x92\x8BTi...' 有错误信息就好办了,结果上网一查结果是:mysql编码格式utf-8格式,不支持带四

apache2.0.39 php4.2.3在windowsXP下模块方式搭建.

apache|window WindowsXP+Apache2.0.39+php-4.2.3-dev源文件下载: 1. http://www.apache.org/dist/httpd/binaries/win32/ 下面的 apache_2.0.39-win32-x86-no_ssl.msi 或者apache_2.0.39-win32-x86-no_ssl.exe (A full setup package (.exe) containing the Win9x/WinNT Microsoft

Dreamweaver MX 2004视频宝典教程(39)

dreamweaver|教程 第 39 集:插入图片 课程目标:学会如何在Dreamweaver中插入图像并设置属性的方法. 课程要点:Dreamweaver中插入图片的方法.<img>标记属性常见的有src, width, height, lowsrc, alt, border, vspace, hspace, align等,这些属性可以在Dreamweaver属性面板中进行可视化设置. [全屏观看] | [下载视频] | 本教程尺寸为 800 * 600 建议下载观看,以达到最佳观看效果

SEO总结:百度K站39天后放出且有排名

年前一站,被百度在1月12时K掉了,site首页都找不到了,之至后还以为会等很久,才会放出来呢,没有想到的是,在本月20号就放出来了. 查看了mytool上的快照记录,前后总共也就是39天的时候,百度就把它给放出来了.可能很多朋友,感觉都不大可能,百度怎么会这么快就放出一个K掉的站呢?下面说说在这网站被百度K掉这段时间里,我所做的事. 1.在查询网站被百度K掉后,当时我就把百度蜘蛛给禁止了,但是禁止的时间不长,只禁止一个星期多点这样子.禁止太久容易让百度产生,这站可能是永久性不要百度抓取的.反而

WPF如何动态生成Code 39条形码

最近在看些条形码方面相关的资料,而如果只是看的话,效果似乎并不怎么好,所以决定动手做点Demo,以增强对相关知识的记忆. 这里是一个我编写的使用WPF生成Code 39的例子,Code 39的编码很简单,故而第一次先用它做为尝试. 标准的Code 39只支持43个字符,0~9,A~Z,-,.,$, /, +, %以及空格.除此之外,*用于起始和终止符号.而通过使用两个编码符的扩展,则可以支持所有的Acsii码字符.相关知识可以在维基百科上找到. 由于是WPF,Demo分为两个文件,xaml文件包

PHP开发框架Yii Framework教程(39) Zii组件-Slider示例

CJuiSlider显示一滑动条,可以通过滑动条来缩放图像或用作其它功能,它封装了 JUI slider插件. 本例通过 CJuiSlider来缩放一副图像: <?php $this->widget('zii.widgets.jui.CJuiSlider', array( 'value'=>50, 'options'=>array( 'min'=>1, 'max'=>100, 'slide'=>'js: function(event,ui){ $("#i

与众不同windows phone (39) 8.0 联系人和日历

介绍 与众不同 windows phone 8.0 之 联系人和日历 自定义联系人存储的增删改查 获 取 Windows Phone 的联系人数据 获取 Windows Phone 的日历数据 示例 1.演示如何操作 自定义联系人存储(自定义联系人的增删改查) ContactsAndCalendar/CustomContacts.xaml <phone:PhoneApplicationPage x:Class="Demo.ContactsAndCalendar.CustomContacts