hihocoder1079(线段树+离散化)
2017-04-21 18:32
204 查看
时间限制: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
题意是一面空白的墙,往上面贴海报,海报区间为(l,r),后面的会覆盖前面的,问最后有多少张能被看见;算是线段树染色法比较典型的一个题目,每个节点保存德是这个区间当前的颜色,由于题目问的是整个区间最后的颜色,我们只需要再更新完后对整个区间惊醒一次询问就行,有个小tip是,有与节点保存的是区间颜色,所有不需要单独开一个lazy数组,node[]的作用与lazy一样,直接往下更新就行了,不同海报的颜色用不同的数字来表示。
还有一个要注意的地方是,有与海报不是一个点,所以在建树是要注意叶子节点是(l,l+1)而不是(l,l),所以return条件要改成(l+1==r),在二分是也要分成(root<<1,l,mid),(root<,1|1mid,r),因为(mid.mid+1)也是一个区间。
ac代码:
单点时限: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
题意是一面空白的墙,往上面贴海报,海报区间为(l,r),后面的会覆盖前面的,问最后有多少张能被看见;算是线段树染色法比较典型的一个题目,每个节点保存德是这个区间当前的颜色,由于题目问的是整个区间最后的颜色,我们只需要再更新完后对整个区间惊醒一次询问就行,有个小tip是,有与节点保存的是区间颜色,所有不需要单独开一个lazy数组,node[]的作用与lazy一样,直接往下更新就行了,不同海报的颜色用不同的数字来表示。
还有一个要注意的地方是,有与海报不是一个点,所以在建树是要注意叶子节点是(l,l+1)而不是(l,l),所以return条件要改成(l+1==r),在二分是也要分成(root<<1,l,mid),(root<,1|1mid,r),因为(mid.mid+1)也是一个区间。
ac代码:
/* title: description: author: averyboy time: version: */ #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #include<string> #include<cmath> #include<map> #include<set> #include<cctype> #include<ctime> #define INF 0x3f3f3f3f const double PI=acos(-1.0); using namespace std; int tree[800080]; int ans; int vis[800080]; int a[100010],b[1000010],c[200020]; map<int,int>mp; void pushdown(int root) { if(tree[root]) { tree[root<<1]=tree[root]; tree[root<<1|1]=tree[root]; tree[root]=0; } return ; } void buildtree(int root,int l,int r) { if(l+1==r) { tree[root]=0; return ; } int mid=(l+r)>>1; buildtree(root<<1,l,mid); buildtree(root<<1|1,mid,r); } void update(int root,int l,int r,int m,int n,int v) { if(m<=l&&n>=r) { tree[root]=v; //cout<<root<<' '<<tree[root]<<endl; return ; } if(l+1==r) return ; pushdown(root); int mid=(l+r)>>1; if(m<=mid) update(root<<1,l,mid,m,n,v); if(n>=mid) update(root<<1|1,mid,r,m,n,v); } void query(int root,int l,int r) { if(tree[root]&&!vis[tree[root]])//查询时判断是否有海报且前面是否出现过 { vis[tree[root]]=1; ans++; return ; } if(l+1==r) return ; pushdown(root); int mid=(l+r)>>1; query(root<<1,l,mid); query(root<<1|1,mid,r); } int main() { int n,l,num,col; while(~scanf("%d%d",&n,&l)) { ans=0; memset(vis,0,sizeof(vis)); num=1; col=1; for(int i=0;i<n;i++) { scanf("%d%d",&a[i],&b[i]); c[i<<1]=a[i]; 4000 c[i<<1|1]=b[i]; } sort(c,c+2*n); for(int i=0;i<2*n;i++)/去重离散化 { if(!mp[c[i]]) { mp[c[i]]=num; num++; } } buildtree(1,1,num-1); for(int i=0;i<n;i++) { // cout<<"???"<<endl; update(1,1,num-1,mp[a[i]],mp[b[i]],col++);//col不同代表海报不同 } query(1,1,num-1); cout<<ans<<endl; } return 0; }
相关文章推荐
- UVa 1471 Defense Lines - 线段树 - 离散化
- hdu4288--Coder--线段树--离线处理+离散化+想法!
- 1019.Line Painting(线段树 离散化)
- 中南OJ1551: Longest Increasing Subsequence Again(分块+离散化线段树)
- POJ 2528 Mayor's posters (线段树,染色问题,离散化要注意)
- HDU 1255 覆盖的面积(离散化+线段树)
- POJ2528:Mayor's posters(线段树区间更新+离散化)
- poj 2528 Mayor's posters(线段树+离散化)
- 2015 UESTC 数据结构专题A题 秋实大哥与小朋友 线段树 区间更新,单点查询,离散化
- poj-3277-City Horizon-离散化+线段树区域更新
- 【POJ】3225 线段树 + 离散化 + 区间交并
- POJ 2528 (线段树 离散化) Mayor's posters
- PKU3277离散化+线段树
- [hiho 21]线段树-离散化
- 洛谷P2471 - 降雨量 - 线段树 + 离散化
- POJ 2528 线段树(离散化+延迟标记)
- poj3277city,离散化+线段树 或 stl的multiset
- poj 1177 又是一道十分恶心到线段树。 主要是用线段树到区间操作。可以用来节省线性查找的时间。 离散化也十分好的一道题。
- Poj1151/HDU1542(求并矩形覆盖的面积)分别用离散化处理,矩形切割,线段树三种方法实现.
- POJ 2299 && HDU 3743 离散化+线段树