hiho #1079 : 离散化
2015-08-11 16:24
525 查看
描述
小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 题解:离散线段树好了,标记是要down的!!!
要注意的是[1,2],[2,3],[3,4]是算3张海报,因为海报实际上是一个连续的区间,所以下标为i对应的是[i,i+1]的区间。所以对于区间[a,b],线段树更新的节点范围是[a,b-1]。还是相当关键的!
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<cstring> #define PAU putchar(' ') #define ENT putchar('\n') #define CH for(int d=0;d<2;d++)if(ch[d]) #define lson x->ch[0],L,M #define rson x->ch[1],M+1,R using namespace std; const int maxn=200000+10,maxnode=400000+10,inf=-1u>>1; struct node{ node*ch[2];int siz;int t; void addt(int a){t=a;return;} void down(){if(t){CH{ch[d]->addt(t);}t=0;}return;} }seg[maxnode],*nodecnt=seg,*root; struct data{int L,R;}d[maxn]; int n,num[maxn],A[maxn],ql,qr,cv,pos;bool ans[maxn]; void build(node*&x=root,int L=1,int R=n<<1){ x=nodecnt++;int M=L+R>>1;if(L==R)x->t=0; else build(lson),build(rson);x->siz=R-L+1;return; } void update(node*&x=root,int L=1,int R=n<<1){ if(ql<=L&&R<=qr)x->addt(cv); else{int M=L+R>>1;x->down(); if(ql<=M)update(lson); if(qr>M)update(rson); }return; } void query(node*x=root,int L=1,int R=n<<1){ if(!x)return; if(x->t)ans[x->t]=true; else{int M=L+R>>1; query(lson);query(rson); }return; } inline int read(){ int x=0,sig=1;char ch=getchar(); for(;!isdigit(ch);ch=getchar())if(ch=='-')sig=0; for(;isdigit(ch);ch=getchar())x=10*x+ch-'0'; return sig?x:-x; } inline void write(int x){ if(x==0){putchar('0');return;}if(x<0)putchar('-'),x=-x; int len=0,buf[15];while(x)buf[len++]=x%10,x/=10; for(int i=len-1;i>=0;i--)putchar(buf[i]+'0');return; } void init(){ n=read();read();build();int x,y; for(int i=1;i<=n;i++)x=num[i<<1]=read(),y=num[(i<<1)|1]=read(),d[i]=(data){x,y}; sort(num+2,num+n*2+1);int L=unique(num+2,num+n*2+1)-num; for(int i=1;i<=n;i++){ ql=upper_bound(num+2,num+L,d[i].L)-num-2; qr=upper_bound(num+2,num+L,d[i].R)-num-3;//attention cv=i;update(); }query();int res=0; for(int i=1;i<=(n<<1);i++)if(ans[i])res++;write(res); return; } void work(){ return; } void print(){ return; } int main(){init();work();print();return 0;}
相关文章推荐
- max sum
- 数据挖掘论坛干货整理
- Tomcat负载均衡原理详解及配置
- C++11 委派构造函数特性怎么使用?
- 下拉菜单
- uva3363
- NSRunLoop(运行循环)
- zookeeper 伪集群模式安装
- VMware 虚拟机下如何安装VMware tools
- 系统吞吐量(TPS)、用户并发量、性能测试概念和公式
- Excel2010在商务办公中的应用-兰晓宇-专题视频课程
- 利用springMVC实现购物车结算功能
- Codeforces Round #315 (Div. 2) C. Primes or Palindromes? (素数打表 回文数)
- C语言中,为什么字符串可以赋值给字符指针变量
- 有关VS2013中,使用scanf函数报错的解决方法
- The iov_iter interface
- 23-IO流-50-IO流(序列流-SequenceInputStream)
- IOS--商品的添加与删除
- 如何查看Linux系统的相关配置信息
- 多线程补充