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. 如何开发、调试Hybrid项目-- 入门篇

    前言 随着移动浪潮的兴起,各种APP层出不穷,极速的业务扩展提升了团队对开发效率的要求,这个时候使用IOS&Andriod开发一个APP似乎成本有点过高了,而H5的低成本.高效率.跨平台等特性 ...

  2. c++ 顺序容器学习

    所谓容器,就是一个装东西的盒子,在c++中,我们把装的东西叫做“元素” 而顺序容器,就是说这些东西是有顺序的,你装进去是什么顺序,它们在里面就是什么顺序. c++中的顺序容器一共有这么几种: vect ...

  3. Linux初学---->WinSCP+Putty

    十二是个初学者,就觉得有意思.所以学下Linux.如果有啥不对的情路过大牛多多指点.心中也开始学着写博客,因为觉得博客对于学习技术不仅是个记录,还是对学的东西一个复习,一个反思,一个交流.另如果有好的 ...

  4. 旷世奇坑!!!spring 不能自动注入

    一入此坑,只想跳楼.我发誓应该不会有第二个人会进这种坑! 问题描述: 总是不能注入dao层,即@Resposity.always!always!always!(尝试了天下之因特网所有的注入方式,都不能 ...

  5. CLR via C# 3rd - 03 - Shared Assemblies and Strongly Named Assemblies

    1. Weakly Named Assembly vs Strong Named Assembly        Weakly named assemblies and strongly named ...

  6. PP 创建BOM

    转自 http://blog.csdn.net/u012369651/article/details/19190939 一.最终结果预览. 二.创建过程. 使用到的事务码 CS01 创建BOM CS0 ...

  7. C#的选择语句练习2

    1.输入a,b,c三个数,计算一元二次方程ax²+bx+c的根:若a=0,则不是一元二次方程:△=b²-4ac,根的计算公式为-b±√b²-4ac/2a:若△=b²-4ac>0,则方程有两个不一 ...

  8. Atom安装activate-power-mode插件(震动炫酷)

    1.下载安装Atom,地址:https://atom.io/ 2.下载安装activate-power-mode插件,地址:https://github.com/JoelBesada/activate ...

  9. c++句柄设计

    句柄,也称为智能指针. 我计算了一下我的时间,以后每14天得读完一本书,才不愧对我买的这么多书.然而我还要抽出时间来谢谢博文.最近读的是c++沉思录,开篇就用了3章来讲述句柄.好了,废话少说,接下来谈 ...

  10. 关于VR边纹理材质的渲染

    前段时间经常渲染白模线框的图,写了这个脚本方便工作,后来又加了中英文适配,今天贴上来. fn YY_edgestex = ( vr = renderers.current case of ( (vr材 ...