hiho1079 - 数据结构 线段树(入门题,离散化)
描述
小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~
这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住。看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢?
于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有N张海报按照顺序依次贴在了宣传栏上,其中第i张海报贴住的范围可以用一段区间[a_i, b_i]表示,其中a_i, b_i均为属于[0, L]的整数,而一张海报能被看到当且仅当存在长度大于0的一部分没有被后来贴的海报所遮挡住。那么问题就来了:究竟有几张海报能被看到呢?
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第1行为两个整数N和L,分别表示总共贴上的海报数量和宣传栏的宽度。
每组测试数据的第2-N+1行,按照贴上去的先后顺序,每行描述一张海报,其中第i+1行为两个整数a_i, b_i,表示第i张海报所贴的区间为[a_i, b_i]。
对于100%的数据,满足N<=10^5,L<=10^9,0<=a_i<b_i<=L。
输出
对于每组测试数据,输出一个整数Ans,表示总共有多少张海报能被看到。
/*******************************************************/
1.因为L很大,N很小,所以先离散化
2.

所以,这里用1个点代替一个长度为1的区间,即如果一张海波覆盖区间【2,7】,那么需要插入【2,6】
最后遍历整棵树,统计互异非零的标记个数
#include <map>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
const int N = *;
int input1[N],input2[N];
bool visited[N];
int ans = ; struct NODE{
int l,r;
int lazy;
NODE(){ lazy = ; }
int MID(){ return (l+r)>>; }
};
NODE segtree[N*]; void build(int id,int l,int r){
segtree[id].l = l;
segtree[id].r = r;
if(l==r) return ;
int mid = (l+r)>>;
build(id*,l,mid);
build(id*+,mid+,r);
} void modify(int id,int spos,int epos,int value){
if((segtree[id].l==spos)&&(segtree[id].r==epos)){
segtree[id].lazy = value;
return ;
} if(segtree[id].lazy){
segtree[id*+].lazy = segtree[id*+].lazy = segtree[id].lazy;
segtree[id].lazy = ;
} int mid = segtree[id].MID();
if(epos<=mid) modify(id*,spos,epos,value);
else if(spos>mid) modify(id*+,spos,epos,value);
else{
modify(id*+,spos,mid,value);
modify(id*+,mid+,epos,value);
}
} void traverse(int id){
if(segtree[id].lazy){
if(!visited[segtree[id].lazy]){
visited[segtree[id].lazy] = true;
ans++;
}
return ;
}
if(segtree[id].l==segtree[id].r) return ;
traverse(id*+);
traverse(id*+);
} int main(){
int n,L;
scanf("%d%d",&n,&L);
for(int i=;i<n*;i++) scanf("%d",input1+i);
memcpy(input2,input1,sizeof(int)*n*); std::map<int,int > mapping;
std::sort(input1,input1+n*);
int realN = std::unique(input1,input1+n*)-input1;
for(int i=;i<realN;i++) mapping[input1[i]] = i+; build(,,realN);
for(int i=;i<n;i++){
modify(,mapping[input2[i*]],mapping[input2[i*+]]-,i+);
}
memset(visited,false,sizeof(visited));
traverse(); printf("%d\n",ans);
return ;
}
hiho1079 - 数据结构 线段树(入门题,离散化)的更多相关文章
- hiho1080 - 数据结构 线段树(入门题,两个lazy tag)
题目链接 维护区间和,两个操作:一个是将某个区间设置成一个值,一个是将某个区间增加一个固定值 /**************************************************** ...
- poj_2528 Mayor's posters (线段树经典题+离散化方法)
由于题面中给定的wall最大长度为10 000 000:若简单用线段树势必会超时. 而注意到题面中规定了输入海报的个数<=1000:因此不妨离散化,使得线段中叶节点仅含有1000个,那么线段最大 ...
- [poj2104]可持久化线段树入门题(主席树)
解题关键:离线求区间第k小,主席树的经典裸题: 对主席树的理解:主席树维护的是一段序列中某个数字出现的次数,所以需要预先离散化,最好使用vector的erase和unique函数,很方便:如果求整段序 ...
- hdu 1166敌兵布阵(线段树入门题)
>>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...
- 几道简单的线段树入门题 POJ3264&&POJ3468&&POJ2777
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 40687 Accepted: 19137 ...
- Mosaic HDU 4819 二维线段树入门题
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- A Simple Problem with Integers(线段树入门题)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- HDU1698(线段树入门题)
Just a Hook Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descrip ...
- POJ3264(线段树入门题)
Balanced LineupCrawling in process... Crawling failed Time Limit:5000MS Memory Limit:65536KB ...
随机推荐
- Axure设计软件下载安装及注册
如图:本地计算机安装了两个版本的Axure,但8版的有问题,点击保存软件就退出了:7版本要想使用的注册授权 https://blog.csdn.net/botree_chan/article/deta ...
- Hibernate框架学习(四)——事务
一.回顾事务的概念http://www.cnblogs.com/cxq1126/p/8313600.html 1.特性ACID:原子性.一致性.隔离性.持久性 2.并发问题:脏读.不可重复读.幻|虚读 ...
- CDR实例教程-高考789,敢拼就能赢!
本教程是我去年做的一个案例,本来今年想要在做一个,突然意识到今天就是高考日了,没来的及,所以大家将就看些.7.8.9是值得一生纪念的日子,也是以后的每年都会怀念的日子,因为是全国都在上演史诗大剧“决战 ...
- 脚本_统计固定时间段服务器的访问量.sh
#!bin/bash#功能:统计 1:30 到 4:30 所有访问 apache 服务器的请求有多少个#作者:liusingbon#awk 使用-F 选项指定文件内容的分隔符是/或者:#条件判断$7: ...
- JS自定义功能函数实现动态添加网址参数修改网址参数值
无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...
- day01 编程概述及计算机组成原理
目录 编程概述 计算机硬件的五大组成部分 Central Processing Unit(cpu中央处理器) 存储器 输入,输出设备 打开QQ的流程 计算机五大组成部分补充 多核CPU ×64/x86 ...
- mvc模式开发
- [读书笔记] Python数据分析 (二) 引言
1. 数据分析的任务:数据读写,数据准备(清洗,修整,规范化,重塑,切片切块,变形),转换,建模计算,呈现(模型/数据) 2. 数据集: bit.ly的1.usa.gov数据:URL缩短服务bit ...
- MongoDB入门 常用命令以及增删改查的简单操作
1,运行MongoDB服务mongod --dbpath=/usr/local/developmentTool/mongo/data/db/然后启动客户端mongo2,sudo service mon ...
- 关于@SuppressWarnings("unchecked")注解
解释一: 屏蔽某些编译时的警告信息 在强制类型转换的时候编译器会给出警告 加上程序代码 @SuppressWarnings("unchecked& ...