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. web工程中地址的写法

    硬盘地址用\   如:c:\\ 虚拟地址用 / /* 只要是写地址,建议大家最好以"/"开头,/到底代表什么呢? 1.看这个地址是给服务器用的,还是给浏览器用的. 2.如果给浏览器 ...

  2. PHP DES加密

    public function encrypt($str) { //$str = "hh"; $key = "key:123";//密钥 $cipher = M ...

  3. android Button获取焦点

    有时直接使用requestFocus()不能给button设置焦点,经网上查找得到如下结论: 先setFocus,再requestFocus.                 btn.setFocus ...

  4. UIWebView & javascript

    http://blog.163.com/m_note/blog/static/208197045201293015844274/ UIWebView是IOS SDK中渲染网面的控件,在显示网页的时候, ...

  5. Linux学习 -- 备份与恢复

    备份 Linux系统需要备份的数据 /root/ /home/ /var/spool/mail /etc/ others 备份策略 完全备份 增量备份 差异备份 备份和恢复命令 dump  resto ...

  6. R语言——基本绘图函数

    通过一个综合的例子测试绘图函数 学习的内容是tigerfish老师的教程. 第一节:基本知识 用seq函数产生100位学生的学号. > num = seq(,) > num [] [] [ ...

  7. 阅读android项目源码

    版权声明:欢迎转载,转载请注明出处;http://blog.csdn.net/angcyo 上一篇,我们成功导入并运行了 贝壳单词 项目. 这篇文章, 带大家一起读一读源码. 打开 贝壳单词 项目,定 ...

  8. 深入理解React、Redux

    深入理解React.ReduReact+Redux非常精炼,良好运用将发挥出极强劲的生产力.但最大的挑战来自于函数式编程(FP)范式.在工程化过程中,架构(顶层)设计将是一个巨大的挑战.要不然做出来的 ...

  9. 剑指offer之有序二维数组查找

    大多数人注意到元素是行列有序的,会马上想到对每行(或列)进行二分查找,每行(或列)需要logN时间,N行(或列)共需要NlogN时间,很容易写出如下代码 1 2 3 4 5 6 7 8 9 10 11 ...

  10. CentOS/RHEL 7中的firewall控制

    从CentOS/RHEL 7开始firewall的使用.很多人卸载了firewall重装iptables.但是有时候只是为了开放端口什么的,没有那个闲工夫卸载重装: 永久打开一个新端口(如TCP/80 ...