Mayor's posters

转载自:http://blog.csdn.net/winddreams/article/details/38443761

【题目链接】Mayor's posters

【题目类型】线段树+离散化

&题意:

给出一面墙,给出n张海报贴在墙上,每张海报都覆盖一个范围,问最后可以看到多少张海报

&题解:

海报覆盖的范围很大,直接使用数组存不下,但是只有最多10000张海报,也就是说最多出现20000个点,所以可以使用离散化,将每个点离散后,重新对给出控制的区间,这样区间最大就是1到20000.可以直接使用线段树,成段更新,每次更新一个颜色,最后遍历所有的段,将还可以遍历的颜色储存,统计

将-1 定义为没有颜色,0代表有多种颜色,1到m代表各自的颜色,线段树只要在0时向下深入,其他的直接统计颜色。

但是这个题中的离散化有问题,会挤掉中间的颜色,不过poj好像也是这么做的,没有考虑中间的颜色。

如 1 ,10 1,4 7,10 这三组数的正确结果应该是还可以看到3种颜色,但是如果直接排列点的话就会挤掉5到6这一种颜色。

真正的这种成段的离散化,一定要将两个节点中还有值的话,要多加一个节点,代表两个节点中间的值。

&代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define maxn 30005
#define lmin 1
#define rmax n
#define lson l,(l+r)/2,rt<<1
#define rson (l+r)/2+1,r,rt<<1|1
#define root lmin,rmax,1
#define now l,r,rt
#define int_now int l,int r,int rt
int cl[maxn<<2],lazy[maxn<<2],a[maxn];
struct node{
int id1,id2,k;
}p[maxn];
bool cmp(node a,node b){
return a.k<b.k;
}
void push_up(int rt){
if (!cl[rt<<1]||!cl[rt<<1|1]
||cl[rt<<1]!=cl[rt<<1|1]){
cl[rt]=0;
}
else{
cl[rt]=cl[rt<<1];
}
}
void push_down(int rt){
if (lazy[rt]!=-1){
lazy[rt<<1]=lazy[rt<<1|1]=lazy[rt];
cl[rt<<1]=cl[rt<<1|1]=lazy[rt];
lazy[rt]=-1;
}
}
void update(int ll,int rr,int x,int_now){
if (ll>r||rr<l) return ;
if (ll<=l&&r<=rr){
cl[rt]=lazy[rt]=x;
return ;
}
push_down(rt);
update(ll,rr,x,lson);
update(ll,rr,x,rson);
push_up(rt);
}
void query(int ll,int rr,int_now,int *a){
if (cl[rt]==-1) return ;
if (cl[rt]>0){
a[cl[rt]]=1;
return;
}
push_down(rt);
query(ll,rr,lson,a);
query(ll,rr,rson,a);
}
int main(){
int t,i,n,m,l,r,x;
scanf("%d",&t);
while(t--){
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d%d",&p[i].k,&p[i+m].k);
p[i].id1=i;
p[i+m].id1=i+m;
}
sort(p,p+2*m,cmp);
int temp=-1;
n=0;
for(i=0;i<2*m;i++){
if (p[i].k==temp){
p[i].id2=n;
}
else{
p[i].id2=++n;
temp=p[i].k;
}
a[p[i].id1]=p[i].id2;
}
memset(cl,-1,sizeof(cl));
memset(lazy,-1,sizeof(lazy));
for(int i=0;i<m;i++){
update(a[i],a[i+m],i+1,root);
}
memset(a,0,sizeof(a));
query(1,n,root,a);
int num=0;
for(int i=1;i<=m;i++){
if (a[i]) num++;
}
printf("%d\n",num );
}
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    题目链接:http://poj.org/problem?id=2528 题目大意:有一个很上的面板, 往上面贴海报, 问最后最多有多少个海报没有被完全覆盖 解题思路:将贴海报倒着想, 对于每一张海报只 ...

随机推荐

  1. Html 之菜单导航(二)

    网页菜单 网页菜单是一个网页的重要部分,它提供了用户可以对网站所有页面的导航,也是可能是内容的分类,例如淘宝  衣服 鞋子 水果 电脑 等等之类,也可以是 类似于游戏宣传网页一样子,酷炫的js特效 f ...

  2. C# 的各种排序

    http://www.cnblogs.com/jiajiayuan/category/302446.html

  3. iOS 微信分享

    1.注册微信开放平台账号:https://open.weixin.qq.com 2.创建应用 设置图片可以使用一个小工具,详情http://www.cnblogs.com/czq1989/p/5073 ...

  4. linux git 推送空文件夹

    /********************************************************************************* * linux git 推送空文件 ...

  5. 项目中Gradle使用总结

    一.配置Gradle使用Maven仓库 项目过程中,我们可能会遇到maven的本地库和gradle使用的maven本地库,不是同一个库.现在总结下怎么配置使得maven和gradle都使用相同的mav ...

  6. Spring3.0之后->Spring MVC过滤器-HiddenHttpMethodFilter

    浏览器form表单只支持GET与POST请求,而DELETE.PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET.POST.PUT ...

  7. CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\Framework\.。。”--“拒绝访问

    aspx 常见错误 CS0016: 未能写入输出文件“c:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files/... ...

  8. java工厂-积木系列

    这里记录一个例子,工厂模式的理论就不扯淡了. 遇到的问题:支付方式有很多种,比如微信支付 支付宝支付 银联支付 等等.我们在在实现的时候发现他么的流程上是相似的,以及每个方式都有大量的个性配置,在实例 ...

  9. 今天我看了一个H5游戏EUI的例子,我都快分不清我到底是在用什么语言编译了代码了,作为刚刚学习H5游戏开发的菜鸟只能默默的收集知识

    今天看了一个EUI的demo,也是接触H5游戏开发的第五天了,我想看看我能不能做点什么出来,哎,自己写果然还是有问题的.在看EUI哪一个demo的时候就遇见了一些摇摆不定的问题,我觉得提出来 1.to ...

  10. Python实例1

    1.有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 错解: 正解: 源码: #!/usr/bin/python for i in range(1,5): for j in ...