Mayor's posters POJ - 2528 线段树(离散化处理大数?)
题意:输入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 线段树(离散化处理大数?)的更多相关文章
- Mayor's posters POJ - 2528(线段树 + 离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 74745 Accepted: 21574 ...
- Mayor's posters POJ - 2528 线段树区间覆盖
//线段树区间覆盖 #include<cstdio> #include<cstring> #include<iostream> #include<algori ...
- POJ 2528 (线段树 离散化) Mayor's posters
离散化其实就是把所有端点放在一起,然后排序去个重就好了. 比如说去重以后的端点个数为m,那这m个点就构成m-1个小区间.然后给这m-1个小区间编号1~m-1,再用线段树来做就行了. 具体思路是,从最后 ...
- poj 2528(线段树+离散化) 市长的海报
http://poj.org/problem?id=2528 题目大意是市长竞选要贴海报,给出墙的长度和依次张贴的海报的长度区间(参考题目给的图),问最后你能看见的海报有几张 就是有的先贴的海报可能会 ...
- poj 2528 线段树+离散化
题意:在墙上贴一堆海报(只看横坐标,可以抽象成一线段),新海报可以覆盖旧海报.求最后能看到多少张海报 sol:线段树成段更新.铺第i张海报的时候更新sg[i].x~sg[i].y这一段为i. 然而坐标 ...
- poj 2528 线段树 离散化的小技巧
题意:在墙上贴海报,海报可以互相覆盖,问最后可以看见几张海报思路:直接搞超时+超内存,需要离散化.离散化简单的来说就是只取我们需要的值来 用,比如说区间[1000,2000],[1990,2012] ...
- poj 2528 线段树区间修改+离散化
Mayor's posters POJ 2528 传送门 线段树区间修改加离散化 #include <cstdio> #include <iostream> #include ...
- POJ 2528 Mayor's posters 贴海报 线段树 区间更新
注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...
- Picture POJ - 1177 线段树+离散化+扫描线 求交叉图像周长
参考 https://www.cnblogs.com/null00/archive/2012/04/22/2464876.html #include <stdio.h> #include ...
随机推荐
- R语言入门级实例——用igragh包分析社群
R语言入门级实例——用igragh包分析社群 引入—— 本文的主要目的是初步实现R的igraph包的基础功能,包括绘制关系网络图(social relationship).利用算法进行社群发现(com ...
- Hibernate和Mybatis的工作原理以及区别
一.Mybatis的工作流程图 (1).原理详见: MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一 ...
- 从头认识js-DOM1
前面说过一个完整的js实现,包括ECMAScript,BOM,DOM三部分,现在就来讲讲DOM的有关知识. DOM(文档对象模型)是针对HTML和XML文档的一个API(应用程序接口).DOM描绘来一 ...
- 题解-[HNOI2001]遥控赛车比赛
题解-[HNOI2001]遥控赛车比赛 前置知识:记忆化搜索.\(\texttt{Bfs}\). 参考资料 https://www.luogu.com.cn/blog/CYJian/solution- ...
- String字符串位置移动
有规律的String字符串位置移动 1.自定义一个有规律的String字符串 String numstr = "1,2,3,x,y,4,5"; 2.按逗号拆分numstr字符串 S ...
- 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境
基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...
- Web架构之Nginx基础配置
目录 1.Nginx 虚拟主机 1.1.基于域名的虚拟主机 1.2.基于端口的虚拟主机 1.3.基于IP的虚拟主机 2.Nginx include 3.Nginx 日志配置 3.1.访问日志 3.2. ...
- css中:overflow:hidden清除浮动的原理
要想彻底清除浮动的影响,适合的属性不是 clear 而是 overflow. 一般使用 overflow:hidden,利用 BFC 的“结界”特性彻底解决浮动对外部或兄弟元素的影响. 1. 前言: ...
- javascript的垃圾回收机制与内存管理
一.垃圾回收机制—GC Javascript具有自动垃圾回收机制(GC:Garbage Collecation),也就是说,执行环境会负责管理代码执行过程中使用的内存. 原理:垃圾收集器会定期(周期性 ...
- [日志分析]Graylog2采集Nginx日志 主动方式
这次聊一下Graylog如何主动采集Nginx日志,分成两部分: 介绍一下 Graylog Collector Sidecar 是什么 如何配置 Graylog Collector Sidecar 采 ...