hiho #1079 离散化
来源:互联网 发布:华云数据面试 编辑:程序博客网 时间:2024/06/10 05:47
#1079 : 离散化
- 样例输入
5 104 100 21 65 93 4
- 样例输出
5
描述
小Hi和小Ho在回国之后,重新过起了朝7晚5的学生生活,当然了,他们还是在一直学习着各种算法~
这天小Hi和小Ho所在的学校举办社团文化节,各大社团都在宣传栏上贴起了海报,但是贴来贴去,有些海报就会被其他社团的海报所遮挡住。看到这个场景,小Hi便产生了这样的一个疑问——最后到底能有几张海报还能被看见呢?
于是小Ho肩负起了解决这个问题的责任:因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有N张海报按照顺序依次贴在了宣传栏上,其中第i张海报贴住的范围可以用一段区间[a_i, b_i]表示,其中a_i, b_i均为属于[0, L]的整数,而一张海报能被看到当且仅当存在长度大于0的一部分没有被后来贴的海报所遮挡住。那么问题就来了:究竟有几张海报能被看到呢?
提示一:正确的认识信息量
提示二:小Hi大讲堂之线段树的节点意义
输入
每个测试点(输入文件)有且仅有一组测试数据。
每组测试数据的第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,2],[2,3],[3,4]是算3张海报,因为海报实际上是一个连续的区间,所以下标为i对应的是[i,i+1]的区间。所以对于区间[a,b],线段树更新的节点范围是[a,b-1]。然后用线段树求解,每次贴海报进行O(logn)区间更新,用data数组存储对应区间的海拔编号,最后全部海报贴完后还要对线段树进行一次O(n)遍历使所有的lazy值更新到每一个位置上。
#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;#define maxn 100005int a[maxn], b[maxn];int c[2*maxn];int n, l;int compress() //坐标离散化{ memcpy(c, a, sizeof(a)); memcpy(c+n, b, sizeof(b)); sort(c, c+2*n); int size = unique(c, c+2*n)-c; for(int i = 0; i < n; i++){ a[i] = lower_bound(c, c+size, a[i])-c; b[i] = lower_bound(c, c+size, b[i])-c; } return size-1;}struct node{ node(){} node(int ll, int rr) { l = ll; r = rr;} int l, r; int lazy;};node tree[4*maxn];int data[maxn]; //存储对应区间海报编号void build(int rt, int l, int r){ tree[rt] = node(l, r); tree[rt].lazy = 0; if(l == r) return; int m = l+(r-l)/2; build(2*rt, l, m); build(2*rt+1, m+1, r);}void seg_modify(int rt, int ll, int rr, int v){ int l = tree[rt].l, r = tree[rt].r; int &lazy = tree[rt].lazy; int lc = 2*rt, rc = 2*rt+1; if(l == ll && r == rr){ //懒惰更新 lazy = v; return; } else{ if(lazy){ tree[lc].lazy = lazy; tree[rc].lazy = lazy; lazy = 0; } } int m = l+(r-l)/2; if(rr <= m) seg_modify(lc, ll, rr, v); else if(ll > m) seg_modify(rc, ll, rr, v); else{ seg_modify(lc, ll, m, v); seg_modify(rc, m+1, rr, v); }}void traverse(int rt) //遍历线段树,使所有懒惰值真正赋值到data数组上{ int l = tree[rt].l, r = tree[rt].r; int lc = 2*rt, rc = 2*rt+1; if(l == r){ data[l] = tree[rt].lazy; return; } if(tree[rt].lazy){ tree[lc].lazy = tree[rt].lazy; tree[rc].lazy = tree[rt].lazy; } traverse(lc); traverse(rc);}int main(){ while(~scanf("%d%d", &n, &l)){ for(int i = 0; i < n; i++) scanf("%d%d", a+i, b+i); l = compress(); build(1, 0, l-1); for(int i = 0; i < n; i++) seg_modify(1, a[i], b[i]-1, i+1); traverse(1); sort(data, data+l); int ans = unique(data, data+l)-data; if(!data[0]) ans--; printf("%d\n", ans); } return 0;}
- hiho #1079 离散化
- [hiho]#1079 : 离散化 线段树
- HIHO #1079 : 离散化(线段树+离散化)
- hiho 21 线段树 离散化
- hiho一下第二十一周 #1079 : 离散化 【线段树储存区间状态】
- hiho第152周,离散化记笔记记笔记
- hiho一下 第二十一周 离散化与线段树回顾
- hiho刷题日记——第二十一天离散化
- hihoCoder 1079 离散化
- hihocoder 1079 : 离散化
- hihocoder 1079 离散化(线段树+区间离散化)
- hihoCoder - 1079 - 离散化 (线段树 + 离散化)
- hihoCoder 1079 离散化(线段树离散化)
- hihcoder #1079 离散化 线段树+区间离散化
- hiho~
- 离散化
- 离散化
- 离散化
- 数组-12. 简易连连看(20)
- 二叉树路径和
- Unity3D架构系列之- FSM有限状态机设计(六)(总结篇)
- UVa 211 - The Domino Effect [DFS剪枝]
- hdu 5172 线段树
- hiho #1079 离散化
- UVa #1025 A Spy in the Metro (例题9-1)
- UVA 10006 Carmichael Numbers (伪素数)
- 关于Cocos2d-x的一些认识(3)
- Poj 3009 Curling 2.0 (Dfs)
- 机器学习领域的几种主要学习方式
- 透明加密 SDK
- HDU 2203 亲和串 (KMP或者strstr)
- assets文件夹资源的访问