给一块最大为10^8单位宽的墙面,贴poster,每个poster都会给出数据 a,b,表示该poster将从第a单位占据到b单位,新贴的poster会覆盖旧的,最多有10^4张poster,求最后贴完,会看到几张poster (哪怕只露出一个单位,也算该poster可见);

我一看这么大数据,又看了下时间限制只有1s,不科学啊,如果真的按10^8建树不可能过时间啊,而且根据它的空间限制,大概只能建10^7这么大的数组。

后来搜博客发现大家的标题都写着离散化,原来用离散化做这个题目,但是我不会离散化,我想找一篇纯讲离散化的博文来好好研究下,。。。没找到,所以原谅我,这个题目是仔仔细细的分析了别人的原题代码才写出来的,否则我真的不知道怎么弄离散化。

所谓离散化,把a,b所有出现的数字全部排序一遍,新的值就是他们的下标,当然重复的不算,然后每个a,b就会赋予一个更小的值,但完全不影响其功能,由于每个不同值都考虑进去了,所以区间缩小之后,不会出现覆盖混乱,最多是正好全部覆盖。。。。

然后说起这个线段树要维护的,其实就是一个量,该区间是否被覆盖,采取从后往前贴poster,这个跟之前做个一个排队插队的题目同理,从后往前,则状态一定固定了,所以更加方便了,只要判断在已经覆盖了这么多poster的情况下,是否还有空余区间就行了。

话说期间WA了几次不明不白是因为,我忘了用懒惰标记和懒惰更新了,果然好久没写线段树了。。。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 25010
#define Lson x<<1,l,mid
#define Rson (x<<1|1),mid+1,r using namespace std; struct node {
int val;
int num;
} pos[N];
bool flag;
bool d[N*];
int p[N*];
bool cmp2(node a,node b)
{
if (a.val<b.val) return true;
return false;
}
bool cmp(node a,node b)
{
if (a.num>b.num) return true;
if (a.num==b.num && a.val<b.val) return true;
return false;
}
void getup(int x)
{
if (d[x<<]==true || d[x<<|]==true)
d[x]=true;
else
d[x]=false;
}
void build(int x,int l,int r)
{
d[x]=true;
p[x]=;
if (l==r){
return;
}
int mid=(l+r)>>;
build(Lson);
build(Rson);
getup(x);
}
void pushdown(int x,int l,int r)
{
if (!p[x] || l>=r) return;
d[x<<]=d[x<<|]=false;
p[x<<]=p[x<<|]=p[x];
p[x]=;
}
void query(int L,int R,int x,int l,int r)
{
if (L<=l && r<=R)
{
if (d[x])
{
flag=true;
d[x]=false;
p[x]=;
}
return;
}
if (p[x])
pushdown(x,l,r);
int mid=(l+r)>>;
if (L>mid && d[x<<|]) query(L,R,Rson);
else
if (R<=mid && d[x<<]) query(L,R,Lson);
else
if (L<=mid && R>mid){
if (d[x<<]) query(L,R,Lson);
if (d[x<<|]) query(L,R,Rson);
}
getup(x);
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n;
int i,j,k;
scanf("%d",&n);
int a,b;
for (i=;i<n;i++)
{
scanf("%d%d",&pos[i<<].val,&pos[i<<|].val);
pos[i<<].num=pos[i<<|].num=i;
}
sort(pos,pos+*n,cmp2);
int cur=,pre=-;
for (j=;j<*n;j++)
{
if (pre!=pos[j].val){
pre=pos[j].val;
pos[j].val=++cur;
}
else{
pos[j].val=cur;
}
//cout<<pre<<" "<<pos[j].val<<endl;
} build(,,cur); sort(pos,pos+*n,cmp);
int ans=;
for (i=;i<n;i++)
{
//cout<<pos[i<<1].val<<" "<<pos[i<<1|1].val<<endl;
flag=false;
query(pos[i<<].val,pos[i<<|].val,,,cur);
if (flag) {ans++;}
}
printf("%d\n",ans);
}
return ;
}

POJ 2528 Mayor‘s poster 线段树+离散化的更多相关文章

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

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

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

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

  3. poj 2528 Mayor's posters 线段树+离散化 || hihocode #1079 离散化

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

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

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

  5. POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化)

    POJ.2528 Mayor's posters (线段树 区间更新 区间查询 离散化) 题意分析 贴海报,新的海报能覆盖在旧的海报上面,最后贴完了,求问能看见几张海报. 最多有10000张海报,海报 ...

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

    题目链接:http://poj.org/problem?id=2528 给你n块木板,每块木板有起始和终点,按顺序放置,问最终能看到几块木板. 很明显的线段树区间更新问题,每次放置木板就更新区间里的值 ...

  7. POJ 2528 Mayor’s posters (线段树段替换 && 离散化)

    题意 : 在墙上贴海报, n(n<=10000)个人依次贴海报,给出每张海报所贴的范围li,ri(1<=li<=ri<=10000000).求出最后还能看见多少张海报. 分析 ...

  8. poj 2528 Mayor's posters 线段树区间更新

    Mayor's posters Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?id=2528 Descript ...

  9. poj 2528 Mayor's posters(线段树)

    题目:http://poj.org/problem?id=2528 题意:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度.现在往墙上贴N张海报,每张海报的宽度是任意的, 但是必定是单位宽度的整数 ...

随机推荐

  1. 003.Oracle数据库 , 查询日期格式格式化

    /*日期格式转换*/ SELECT TO_CHAR( OCCUR_DATE, 'yyyy/mm/dd hh24:mi:ss' ) FROM LM_FAULT WHERE ( ( OCCUR_DATE ...

  2. 微信小程序提示:https://api.map.baidu.com 不在以下 request 合法域名列表中

    如果你想利用百度地图API定位来获得当前位置,但却出现了如标题所示问题,那么请接着看: 1.首先我们需要在百度地图开放平台(https://lbs.baidu.com/apiconsole/key?a ...

  3. maven详解 之 pom.xml

    Maven  一个项目管理工具  其作用就是用来管理jar 包的 maven的核心    pom.xml配置文件 <project xmlns="http://maven.apache ...

  4. leetcode349 350 Intersection of Two Arrays & II

    """ Intersection of Two Arrays Given two arrays, write a function to compute their in ...

  5. (最详细)JAVA如何连接虚拟机的HBASE和hadoop(JAVA如何远程访问虚拟机HBASE)

    第一步: 首先把虚拟机和你的主机(本地电脑)弄通这样本地机器才能访问虚拟机里面的内容 我用的虚拟机为 VMware Workstation linux 为 centeros 补充一点虚拟机设置 1  ...

  6. Golang的进制转换实战案例

    Golang的进制转换实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.常用进制概述 1>.进制概述 进制也就是进位制,是人们规定的一种进位方法.举个例子:二进制就 ...

  7. JavaScript中的apply()方法和call()

    apply()和call()的真正用武之地是能够扩充函数赖以运行的作用域   两个函数的第一个参数是都是,要执行语句的作业域,即this 区别是 apply后面只能传一个大参数,call后面参数只能一 ...

  8. 如何将本地项目推送到Github

    如何将本地项目推送到Github Tip:在本地要安装好Git,官网:https://git-scm.com/ 一个学习Git的好地方:https://try.github.io/ 在线闯关实战,边练 ...

  9. Arduino函数

    输入输出函数 pinMode(pin, mode)将数位脚位(digital pin)指定为输入或输出.如:pinMode(7,INPUT); // 将脚位 7 设定为输入模式 digitalWrit ...

  10. vs code 切换语言(切换回英文)

    安装中文 安装教程:https://www.cnblogs.com/chenxi188/protected/p/11757456.html 切换回英文 调出搜索:ctrl+shift+p 输入:lan ...