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 ...
随机推荐
- IntelliJ Idea使用代码折叠
VS风格: //region xxxxxxxxxxxxxx ............. //endregion 快捷键: Ctrl+Shift+”+/-”,全部展开.折叠
- java根据出生日期计算年龄
/** * @author jerry.chen * @param brithday * @return * @throws ParseException * 根据生日获取年龄; */ public ...
- 从DataTable高效率导出数据到Excel
首先从数据库读取数据到DataTable,这我就不提了,大家都明白.下面直接介绍如何从DataTable高效率导出数据到Excel中的方法,代码如下: using Microsoft.Office.I ...
- activity工作流学习地址
https://wenku.baidu.com/view/8572153150e2524de4187e5d.html
- [转] hadoop MapReduce实例解析-非常不错,讲解清晰
来源:http://blog.csdn.net/liuxiaochen123/article/details/8786715?utm_source=tuicool 2013-04-11 10:15 4 ...
- jq——事件
http://www.w3school.com.cn/jquery/jquery_ajax_intro.asp $(document),$(body) 加载事件: $(document).ready( ...
- 使用easyui combobox初始化+在input中触发下拉框+获取值
效果图: 1.html <input id="alarmLeve" class="easyui-combobox" name="alarmLev ...
- python的迭代器、生成器、三元运算、列表解析、生成器表达式
一 迭代的概念 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前 ...
- 大数据相关文档&Api下载
IT相关文档&Api下载(不断更新中) 下载地址:https://download.csdn.net/user/qq_42797237/uploads 如有没有你需要的API,可和我留言,留下 ...
- VS2015 C# 编写USB通信上位机时,改变net框架导致DLL调用失败的问题解决方法
最近在写USB通信的上位机,调用了windows里的DLL,开发环境:64位WIN7 .VS2015.NET4.5.2:开发完成后在自己的电脑可用,在32位电脑.NET其他版本以及WIN10的环境下不 ...