题意:输入t组数据,输入n代表有n块广告牌,按照顺序贴上去,输入左边和右边到达的地方,问贴完以后还有多少块广告牌可以看到(因为有的被完全覆盖了)。

思路:很明显就是线段树更改区间,不过这个区间的跨度有点大(看数据),不过n<10000,所以就可以把这些广告牌的边界重新定义编号,比如:

n输入 2

1 6

2 13

排序以后,1还是1,2还是2,6就可以看成3,13就可以看成4

变成:

1 3

2 4

其实性质还是没有变,两个广告牌都可以看到,不过线段树开的数组就不用很大了。

#include<algorithm>
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int ans,book[20010],index[10000005],sum[400010],lazy[400010],a[10010],b[10010],c[20010];
void pushdown(int l,int r,int o)
{
if(lazy[o])
{
lazy[o<<1]=lazy[o<<1|1]=lazy[o];
sum[o<<1|1]=sum[o<<1]=lazy[o];
lazy[o]=0;
}
}
void update(int l,int r,int o,int x,int y,int c)
{
if(x<=l&&y>=r)
{
sum[o]=c;
lazy[o]=c;
return;
}
pushdown(l,r,o);
int mid=(l+r)/2;
if(x<=mid) update(l,mid,o<<1,x,y,c);
if(y>mid) update(mid+1,r,o<<1|1,x,y,c);
}
void query(int l,int r,int o)
{
if(l==r)
{
if(!book[sum[o]])
{
ans++;
book[sum[o]]=1;
}
return;
}
pushdown(l,r,o);
int mid=(l+r)/2;
query(l,mid,o<<1);
query(mid+1,r,o<<1|1);
}
int main()
{
int t,n,x,y;
scanf("%d",&t);
while(t--)
{
memset(book,0,sizeof(book));
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
scanf("%d",&n);
int w=0;
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
c[w++]=a[i];
c[w++]=b[i];//重新编号
}
sort(c,c+w);
int cnt=0;
for(int i=0;i<w;i++)
if(c[i]!=c[i+1])
index[c[i]]=++cnt;
for(int i=1;i<=n;i++)
{
x=index[a[i]];
y=index[b[i]];
update(1,cnt,1,x,y,i);
}
ans=0;
query(1,cnt,1);
printf("%d\n",ans);
}
return 0;
}

Mayor's posters POJ - 2528 线段树(离散化处理大数?)的更多相关文章

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

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

  2. Mayor's posters POJ - 2528 线段树区间覆盖

    //线段树区间覆盖 #include<cstdio> #include<cstring> #include<iostream> #include<algori ...

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

    离散化其实就是把所有端点放在一起,然后排序去个重就好了. 比如说去重以后的端点个数为m,那这m个点就构成m-1个小区间.然后给这m-1个小区间编号1~m-1,再用线段树来做就行了. 具体思路是,从最后 ...

  4. poj 2528(线段树+离散化) 市长的海报

    http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...

  5. poj 2528 线段树+离散化

    题意:在墙上贴一堆海报(只看横坐标,可以抽象成一线段),新海报可以覆盖旧海报.求最后能看到多少张海报 sol:线段树成段更新.铺第i张海报的时候更新sg[i].x~sg[i].y这一段为i. 然而坐标 ...

  6. poj 2528 线段树 离散化的小技巧

    题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...

  7. poj 2528 线段树区间修改+离散化

    Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...

  8. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...

  9. Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长

    参考  https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...

随机推荐

  1. 跟我猜Spring-Boot:bean的创建

    废话在前 最近几年的技术路子很杂,先是node,然后是php,后来是openresty,再后来转到了java,而接触的框架(Framework),也越发的复杂,从最开始的express/koa,到lu ...

  2. Arthas 实战,助你解决同名类依赖冲突问题

    上篇文章中,小黑哥分析 Maven 依赖冲突分为两类: 项目同一依赖应用,存在多版本,每个版本同一个类,可能存在差异. 项目不同依赖应用,存在包名,类名完全一样的类. 第二种情况,往往是这个场景,本地 ...

  3. 🤢保护眼睛,从更换win电脑主题开始🤢

    目的: win电脑主题颜色设置为

  4. spring——AOP原理及源码(四)

    前情回顾: 上文我们一路分析了从容器创建开始直到我们的AOP注解导入的核心组件AnnotationAwareAspectJAutoProxyCreator执行postProcessBeforeInst ...

  5. 超详细,多图文介绍redis集群方式并搭建redis伪集群

    超详细,多图文介绍redis集群方式并搭建redis伪集群 超多图文,对新手友好度极好.敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲.且看且珍 ...

  6. 前端---css3优化

    一.视差滚动(经过优化后的代码) .front::before { content: ''; position: fixed; // 代替background-attachment width: 10 ...

  7. 配置ubunto 流量使用限制 python 实现简单 http server

    很多ubunto 都有流量限制,使用流量.如每天使用200M ,超过了就要提示信息 原理,在本机 开一个 http 服务, 显示错误信息,哪流量使用完以后,使用 iptables 将 流量转发到 本机 ...

  8. 仿IntelliJ Darcula的Swing主题FlatLaf使用方法

    最近Sandeepin想写个基于Java Swing的RSS阅读器练练手,不过Swing默认主题太丑了,切成系统原生的主题也不是非常好看,正好感觉开发时用的IDEA主题很不错,不管是Light还是Da ...

  9. [BlueZ] 3、使用 meshctl 连接控制一个 sig mesh 灯

    目录 前言 1.准备工作 2.meshctl 连接.配置.控制 sig mesh 灯 3.最终效果: LINKS 前言 本文介绍如何使用 meshctl 配对.连接.控制一个 sig mesh 球泡灯 ...

  10. JAVAEE学习day05学习,数组

    容器及元素的概念 容器:是将多个数据存储到一起 元素:每个数据称为该容器的元素 数组的概念 数组:数组是长度固定,存储数据的容器,保证多个数据的类型要一致 数组定义格式及其描述 动态定义: 数据类型 ...