如有错误,请留言提醒,不要坑到小朋友
Description
有n个给定的闭区间[a(i),b(i)],i=1,2,.....n。这些区间的和也许被另外一个称之为pairwise的不交叉的闭区间集所代表。我们的任务是用最小的区间个数找到这种替代,然后将其按照升序写入输出文件。我们说区间[a,b]与[c,d]符合升序,仅当条件a<=b<c<=d成立。
任务
编写一程序
1、从文件PRZ.IN中读入此连续区间的描叙;
2、求出满足以上条件的pairwise非交叉区间集;
3、求出的区间集按照升序写入文件PRZ.OUT。
输入
输入文件的第一行为整数n,它表示区间的个数,3<=n<=50000。在第i+1(1<=i<=n)行的俩个整数a(i)y与b(i)是对区间[a(i),b(i)]的描述,中间用空格隔开,分别表示这个区间的开始和结束,1<=a(i)<=b(i)<=1000000。
输出
输出文件应含有所有求出的pairwise非交叉区间集。它的每一行都对应描述着一区间----由俩整数组成,中间用空格隔开,分别表示这个区间的开始和结束。同时,此区间集应是按序写入的。
样例输入
5
5 6
1 4
10 10
6 9
8 10
样例输出
1 4
5 10
这题就是裸差分,不解释。。学习差分传送门http://zh.wikipedia.org/wiki/%E5%B7%AE%E5%88%86
#include<cstdlib> #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #define maxn 1100000 using namespace std; inline int read(){ int tmp=0;char ch; while(ch=getchar())if('0'<=ch&&ch<='9')break; for(;'0'<=ch&&ch<='9';ch=getchar())tmp=tmp*10+ch-'0'; return tmp; } int cha[maxn],r,now[maxn],n; bool cover[maxn],ing; int main(){ n=read(); for(int i=1;i<=n;i++){ int a=read(),b=read(); cha[a]+=1;cha[b]-=1;cover[a]=1; r=max(b+1,r); } for(int i=1;i<=r;i++){ now[i]=now[i-1]+cha[i]; // printf("%d %d\n",now[i],i); } for(int i=1;i<=r;i++)if(now[i-1]&&!now[i])printf("%d\n",i),ing=0; else if(!now[i-1]&&now[i])printf("%d ",i),ing=1; else if(!ing&&cover[i])printf("%d %d\n",i,i); // system("pause"); }