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. 

 
  题目大致就是说给一个线段覆盖线段,问最后没有被完全覆盖的线段的个数。
  这是第一次写离散,也是第三次写线段树的区间更新,想了好久,发现是个空线段树,只需要COL,即标记,不需要BIT来保存啥数据。
  离散的话是因为数据范围太大,只取用到的,排序后分别编号为1...N ,再用。
  (注:这个题要注意,离散的话比如3和7分别标号为4和5的话,那么如果第一个覆盖1-20,第二个覆盖1-3 , 另一个覆盖 7-10 的话,那么编号4和5都被覆盖,结果将为2,而不是正确的3 。 所以可以按照杭电那位大神的处理方法,只要3和7之间超过1,那么再加一个数4,这样的话分别编号为4,5,6就好了。)
  标记记录每次更新的为编号几。
 
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> #define lson L,M,po*2
#define rson M+1,R,po*2+1 using namespace std; int COL[*];
int num[];
int num1[];
int rnum[];
int cou;
bool vis[]; int findH(int x,int L,int R)
{
int M=(L+R)/; if(rnum[M]==x)
return M; if(rnum[M]<x)
return findH(x,M+,R);
else
return findH(x,L,M);
} void pushDown(int po)
{
if(COL[po])
{
COL[po*]=COL[po];
COL[po*+]=COL[po]; COL[po]=;
}
} void update(int ul,int ur,int cha,int L,int R,int po)
{ if(ul<=L&&ur>=R)
{
COL[po]=cha; return;
} pushDown(po); int M=(L+R)/; if(ul<=M)
update(ul,ur,cha,lson);
if(ur>M)
update(ul,ur,cha,rson); } void query(int L,int R,int po)
{
if(L==R)
{
if(COL[po])
vis[COL[po]]=; return;
} pushDown(po); int M=(L+R)/; query(lson);
query(rson);
} int main()
{
int T,N;
int a,b;
int ans=;
cin>>T; while(T--)
{
memset(COL,,sizeof(COL));
memset(vis,,sizeof(vis));
scanf("%d",&N); ans=; for(int i=;i<N;++i)
{
scanf("%d %d",&num[i*],&num[i*+]);
num1[i*]=num[i*];
num1[i*+]=num[i*+];
} sort(num,num+*N); rnum[]=num[];
cou=;
for(int i=;i<N*;++i)
{
if(num[i]==num[i-])
continue; if(num[i]-num[i-]>)
rnum[cou++]=num[i-]+; rnum[cou++]=num[i];
} for(int i=;i<N;++i)
{
a=findH(num1[i*],,cou-);
b=findH(num1[i*+],,cou-); update(a+,b+,i+,,cou,);
} query(,cou,); for(int i=;i<=N;++i)
if(vis[i])
++ans; printf("%d\n",ans);
} return ;
}

(中等) POJ 2528 Mayor's posters , 离散+线段树。的更多相关文章

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

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

  2. POJ 2528——Mayor's posters——————【线段树区间替换、找存在的不同区间】

    Mayor's posters Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Sub ...

  3. POJ 2528 Mayor's posters(线段树区间染色+离散化或倒序更新)

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

  4. POJ 2528 Mayor's posters(线段树/区间更新 离散化)

    题目链接: 传送门 Mayor's posters Time Limit: 1000MS     Memory Limit: 65536K Description The citizens of By ...

  5. POJ 2528 ——Mayor's posters(线段树+区间操作)

    Time limit 1000 ms Memory limit 65536 kB Description The citizens of Bytetown, AB, could not stand t ...

  6. POJ 2528 Mayor's posters(线段树)

    点我看题目 题意 :建一堵墙粘贴海报,每个候选人只能贴一张海报,海报的高度与墙一样高,一张海报的宽度是整数个单位,墙被划分为若干个部分,每个部分的宽度为一个单位,每张海报完全的覆盖一段连续的墙体,墙体 ...

  7. POJ 2528 Mayor's posters(线段树染色问题+离散化)

    http://poj.org/problem?id=2528 题意: 给出一面无限长的墙,现在往墙上依次贴海报,问最后还能看见多少张海报. 题意:这道题目就相当于对x轴染色,然后计算出最后还能看见多少 ...

  8. POJ:2528(Mayor's posters)离散化成段更新+简单哈希

    http://poj.org/problem?id=2528 Description The citizens of Bytetown, AB, could not stand that the ca ...

  9. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

随机推荐

  1. druid-1.0.13 数据库配置文件密码加密

    1.cmd 切换到druid目录  我的是C:\tool\apache-tomcat-7.0.67\webapps\projectA\WEB-INF\lib 2.运行命令 java -cp druid ...

  2. 配置App真机测试证书的流程 一览

    原文链接:http://www.jianshu.com/p/6b0de0d4c925 有开发者账号的前提下, 请进行如下步骤:1.首先登录网站:https://developer.apple.com. ...

  3. c# 去除文本的html标签

    public static string ContentReplace(string input) { input = Regex.Replace(input, @"<(.[^> ...

  4. HDU 2672 god is a girl

    先找规律,发现是斐波那契数列...然后..水题.. #include<cstdio> #include<cstring> #include<cmath> #incl ...

  5. ViewPager滑动标签-PagerSlidingTabStrip的使用

    有篇博客写的已经非常详细,所以不再写了.主要在于导入这个Library,导入Library看自己的笔记 博客地址:http://doc.okbase.net/HarryWeasley/archive/ ...

  6. java开发地三天——数据库介绍

    又是一天萌萌哒地过去了,今天是处理数据库的部分.SQL Server 2008,这东西是上学期搞MFC的时候接触到的,那时候话说安装就是一个大问题,然后在学SQL语句的时候感觉还好,一切都还过得去.现 ...

  7. shell执行php文件传递参数

    php -f index.php hello test 2314 shell命令执行php文件不像http那样通过GET方式传参 同样php文件获取的时候也不能用$_GET方法了 而是通过$argv[ ...

  8. 一个基于jQuery的简单树形菜单

    在工作中的项目使用的是一个前端基于 jQuery easyui 的一个系统,其中左侧的主菜单使用的是 easyui 中的 tree 组件,不是太熟悉,不过感觉不是太好用. 比如 easyui 中的 t ...

  9. ArrayList和数组间的相互转换

    开发中不免碰到List与数组类型之间的相互转换,举一个简单的例子: package test.test1; import java.util.ArrayList; import java.util.L ...

  10. 深入Java单例模式(转)

    深入Java单例模式 源自 http://devbean.blog.51cto.com/448512/203501 在GoF的23种设计模式中,单例模式是比较简单的一种.然而,有时候越是简单的东西越容 ...