hihoCoder1079 线段树+离散化
2017-07-22 15:53
381 查看
线段树+离散化
单点时限:1000ms
内存限制:256MB
这天小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。
样例输入
样例输出
#1079 : 离散化
时间限制:10000ms单点时限:1000ms
内存限制:256MB
描述
小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,表示总共有多少张海报能被看到。样例输入
5 10 4 10 0 2 1 6 5 9 3 4
样例输出
5
#include <iostream> #include <algorithm> #include <cstdio> #include <string.h> #include <set> using namespace std; const int AX = 1e5+666; int n,ll; int s[AX<<4]; int x[AX<<2]; int y[AX<<2]; int Float[AX*3]; set<int>v; void pushdown(int rt){ if(s[rt] != -1){ s[rt<<1] = s[rt<<1|1] = s[rt]; s[rt] = -1; } } int binary_search(int key,int n,int X[]){ int l = 0 , r = n-1; int m; while(l <= r){ m = (l + r) >> 1; if(key == X[m]) return m; if(X[m] < key) l = m + 1; else r = m - 1; } return 1; } void update_tree(int L,int R,int val,int l,int r,int rt){ if(L <= l && r <= R){ s[rt] = val; return ; } pushdown(rt); int m = (l + r) >> 1; if(L <= m) update_tree(L,R,val,l,m,rt<<1); if(R > m ) update_tree(L,R,val,m+1,r,rt<<1|1); } void query(int l,int r,int rt){ if(s[rt] != -1){ v.insert(s[rt]); } if(l == r) return; pushdown(rt); int m = (l + r) >> 1; query(l,m,rt<<1); query(m+1,r,rt<<1|1); } int main(){ scanf("%d%d",&n,&ll); int cnt = 0; for(int i=0;i<n;i++){ scanf("%d%d",&x[i],&y[i]); Float[cnt++] = x[i]; Float[cnt++] = y[i]; } sort(Float,Float+cnt); int m = 1; for(int i=1;i<cnt;i++){ if(Float[i] != Float[i-1]) Float[m++] = Float[i]; } for(int i=m-1;i>0;i--){ if(Float[i] != Float[i-1]+1) Float[m++] = Float[i-1]+1; } sort(Float,Float+m); memset(s,-1,sizeof(s)); int L,R; for(int i = 0 ;i < n ; i++){ //discretization /*L = lower_bound(Float,Float+m,x[i])-Float+1; R = lower_bound(Float,Float+m,y[i])-Float;*/ L = binary_search(x[i],m,Float)+1; //一定要+1,因为查找到的序列是从0开始的,因为这个wa的好久不知道怎么回事 R = binary_search(y[i],m,Float); //cout<<L<<' '<<R<<endl; update_tree(L,R,i,1,m,1); } query(1,m,1); int ans = v.size(); printf("%d\n",ans); return 0; }
相关文章推荐
- hihoCoder#1079(线段树+坐标离散化)
- Hihocoder 1079 离散化
- HIHO #1079 : 离散化(线段树+离散化)
- hihoCoder - 1079 - 离散化 (线段树 + 离散化)
- hihoCoder:#1079(线段树+离散化)
- hihocoder-1079题解(线段树+离散化)
- hihoCoder - 1079 - 离散化 (线段树 + 离散化)
- HihoCoder 1079 线段树 + 离散化
- hihoCoder 1079 离散化(线段树离散化)
- hihocoder 1079离散化 java实现
- hihocoder 1079 离散化(线段树+区间离散化)
- hihoCoder 1079 离散化
- POJ 2528 Mayor's posters (线段树+离散化)
- POJ 2528 Mayor's posters --线段树+离散化
- hicocoder1079离散化+线段树
- #1079 : 离散化+线段树
- 【线段树+离散化】Uestc-数据结构专题训练【B】
- Mayor's posters 线段树+离散化+曾经RE无数边
- Picture(hdu1828,求周长并,线段树+离散化+扫描)
- Codeforces Beta Round #19 D. Points 线段树+离散化离散化