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 ...
随机推荐
- css3子级高度与父级同高,内容垂直居中
.E-wrap{ overflow: hidden; position: relative; border: 1px solid #ccc; margin: 30px auto 0; width: 5 ...
- SwipeRefreshLayout的使用,下拉刷新
1. <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android ...
- 关于iOS11上MJRefresh tabview刷新后,重新加载另一组数据, 回不到顶部或者头尾显示混乱等问题解决
MJRefresh在iOS11上存在很多bug 比如在iphoenx上首尾仍会显示的问题 刷新数据后tableview置顶不上去等问题 虽然官方给出了适配方案 但是问题还没有的到解决 比如tabvi ...
- vue-cli webpack配置中 如何启动less-loader sass-loader
在vue-cli中构建的项目是可以使用less的,但是查看package.json可以发现,并没有less相关的插件,所以我们需要自行安装. //第一步:安装 npm install less les ...
- 操作mysql操作数据库
操作数据库 查询数据库:show databases: 增加数据库:create database student default character set uft-8:(设置默认字符集) 删除数据 ...
- Hibernate---criteria的具体使用列子
方法 说明 Restrictions.eq = Restrictions.allEq 利用Map来进行多个等于的限制 Restrictions.gt > Restrictions.ge > ...
- CF950B Intercepted Message_双指针法
本来想直接上权值线段树维护区间最值,不过可以用双指针法,就使问题变得简洁. Code: #include<iostream> using namespace std; const int ...
- Client初见——python
from socket import *ip_port = ('127.0.0.1',8080)back_log = 5buffer_size = 1024tcp_client = socket(AF ...
- 【XSY2689】王子 - 网络流
复活!qwq 题目来源:2018冬令营模拟测试赛(九) 题意: [背景描述] 不是所有王子都会遇见自己的中关村,主公,公主. 从前有个王子姓王,王王子遇到了一位美丽的公主,她的名字当然是公公主 ...
- 基于 OSGi 的面向服务的组件编程
作者:曹 羽中 (caoyuz@cn.ibm.com), 软件工程师, IBM中国开发中心 出处:http://www.ibm.com/developerworks/cn/opensource/os- ...