【题目大意】

在墙上贴海报,问最后能看到几张海报?

【注意点】

1.首先要注意这是段线段树,而非点线段树。读题的时候注意观察图。来看discuss区下面这组数据:

3

5 6

4 5

6 8

上面数据的答案应该是2,注意观察图,覆盖的是区间。

2.离散化

由于覆盖的是区间,不能简单的离散化,否则会出现差错。比如说下面这组数据:

1 5

1 3

4 5

以及

1 5

1 2

4 5

如果简单离散化都会变成:

1 4

1 2

3 4

最后得出只能看到两张海报的结论,而事实上第一组数据中能够看到三张海报,为了解决这个问题,如果相邻两个数之间相差大于1,就补上一个中间的数字。

比如说1 4,离散化成为1 2 3

3.数据范围:线段树要开到<<4,至于为什么还没有研究出来。X要开到三倍,因为不仅要考虑左右边界均放进来,而且还要考虑中间增添上来离散化的数字。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
/*define后面绝对不能加分号*/
using namespace std;
const int MAXN=+;
int l[MAXN],r[MAXN];
int X[MAXN*],t,M;
int col[MAXN<<];
int hash[MAXN];
/*延迟标记当前区域被编号为几的覆盖*/
int ans; void pushdown(int rt)
{
if (col[rt]!=-)
{
col[rt<<]=col[rt];
col[rt<<|]=col[rt];
col[rt]=-;
}
} int Bin(int key)
{
int ub=,lb=M+;
while (lb>ub)
{
int m=(ub+lb)/;
if (X[m]==key) return m;
if (X[m]>key) lb=m;
else (ub=m);
}
return -;
} void update(int L,int R,int l,int r,int rt,int cit)
{
if (L<=l && r<=R)
{
col[rt]=cit;
return;
}
pushdown(rt);
int m=(l+r)>>;
if (L <= m) update(L,R,lson,cit);
if (m < R) update(L,R,rson,cit);
} void query(int l,int r,int rt)
{
if (col[rt]!=-)
{
if (hash[col[rt]]!=) ans++;
hash[col[rt]]=;
return;
}
if (l==r) return;
int m=(l+r)>>;
query(lson);
query(rson);
} void init()
/*输入数据并进行离散化*/
{
int num=;
scanf("%d",&t);
for (int i=;i<t;i++)
{
scanf("%d%d",&l[i],&r[i]);
X[++num]=l[i];
X[++num]=r[i];
}
sort(X+,X+num+);
/*M来记录离散化之后总共出现了几个数字*/
M=;
/*注意因为下面的for循环是从2开始的,所以m的初始值要是1,否则第一个数字会被覆盖掉*/
for (int i=;i<=num;i++)
{
if (X[i]!=X[i-]) X[++M]=X[i];
/*重复的数字只记录一次*/
}
num=M;
for (int i=;i<=num;i++)
{
if (X[i]-X[i-]>) X[++M]=X[i]-;
/*离散化时要注意,如果两个点相差大于1,则在中间再插入一个数字*/
}
sort(X+,X+M+);
} void submain()
{
memset(col,-,sizeof(col));
for (int i=;i<t;i++)
{
int lp=Bin(l[i]);
int rp=Bin(r[i]);
update(lp,rp,,M,,i);
/*二分查找左边界和右边界离散化后对应的数值*/
}
} int main()
{
int T;
scanf("%d",&T);
for (int kase=;kase<T;kase++)
{
init();
submain();
ans=;
memset(hash,,sizeof(hash));
query(,M,);
cout<<ans<<endl;
}
return ;
}

【线段树+离散化】POJ2528-Mayor's posters的更多相关文章

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

    Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 51175 Accepted: 14820 Des ...

  2. 线段树---poj2528 Mayor’s posters【成段替换|离散化】

    poj2528 Mayor's posters 题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报 思路:这题数据范围很大,直接搞超时+超内存,需要离散化: 离散化简单的来说就是只取我们需要 ...

  3. poj-----(2528)Mayor's posters(线段树区间更新及区间统计+离散化)

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

  4. [POJ2528]Mayor's posters(离散化+线段树)

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

  5. [poj2528] Mayor's posters (线段树+离散化)

    线段树 + 离散化 Description The citizens of Bytetown, AB, could not stand that the candidates in the mayor ...

  6. POJ 2528 Mayor's posters(线段树+离散化)

    Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...

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

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

  8. poj 2528 Mayor's posters 线段树+离散化技巧

    poj 2528 Mayor's posters 题目链接: http://poj.org/problem?id=2528 思路: 线段树+离散化技巧(这里的离散化需要注意一下啊,题目数据弱看不出来) ...

  9. Mayor's posters (线段树+离散化)

    Mayor's posters Description The citizens of Bytetown, AB, could not stand that the candidates in the ...

随机推荐

  1. bzoj 1052 dfs

    首先可以二分答案,将最优性问题转化为判定性问题. 对于二分到的边长,我们可以把所有的点看成一个大的矩形,这个矩形为包括所有点的最小矩形,那么贪心的想,3个正方形,第一个肯定放在这个矩形其中的一角,然后 ...

  2. send,recv,sendto,recvfrom ~转载

     send,recv,sendto,recvfrom send函数 int send( SOCKET s,    const char FAR *buf,    int len,    int fla ...

  3. win7下安装Linux实现双系统全攻略

    http://jingyan.baidu.com/article/c275f6bacc3326e33c756743.html

  4. linux信号Linux下Signal信号太详细了,终于找到了

    linux信号Linux下Signal信号太详细了,终于找到了 http://www.cppblog.com/sleepwom/archive/2010/12/27/137564.html

  5. freemark基础知识

    前言:使用freemarker对应生成一个html文件,保存到磁盘,访问文件就不一定使用tomcat,可以使用nginx(http服务器)访问.可以使用freemaker工具生成.只生成一次,html ...

  6. idea+spring+springmvc+mybatis+mybatis+maven

    使用SSM(Spring,SpringMVC和Mybatis) 1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johns ...

  7. 【Android开发日记】之入门篇(十五)——ViewPager+自定义无限ViewPager

    ViewPager 在 Android 控件中,ViewPager 一直算是使用率比较高的控件,包括首页的banner,tab页的切换都能见到ViewPager的身影. viewpager 来源自 v ...

  8. Leetcode 之Length of Last Word(37)

    扫描每个WORD的长度并记录即可. int lengthOfLast(const char *s) { //扫描统计每个word的长度 ; while (*s) { if (*s++ != ' ')/ ...

  9. socket实现udp与tcp通信-java

    1.简单介绍Socket Socket套接字 网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字. 通信的两端都有Socket. 网络通信其实就是Socket间的通信. 数 ...

  10. UVALive 5099

    B - Nubulsa Expo Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit S ...