7620:区间合并
- 总时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
-
给定 n 个闭区间 [ai; bi],其中i=1,2,...,n。任意两个相邻或相交的闭区间可以合并为一个闭区间。例如,[1;2] 和 [2;3] 可以合并为 [1;3],[1;3] 和 [2;4] 可以合并为 [1;4],但是[1;2] 和 [3;4] 不可以合并。
我们的任务是判断这些区间是否可以最终合并为一个闭区间,如果可以,将这个闭区间输出,否则输出no。
- 输入
- 第一行为一个整数n,3 ≤ n ≤ 50000。表示输入区间的数量。
之后n行,在第i行上(1 ≤ i ≤ n),为两个整数 ai 和 bi ,整数之间用一个空格分隔,表示区间 [ai; bi](其中 1 ≤ ai ≤ bi ≤ 10000)。 - 输出
- 输出一行,如果这些区间最终可以合并为一个闭区间,输出这个闭区间的左右边界,用单个空格隔开;否则输出 no。
- 样例输入
-
5 5 6 1 5 10 10 6 9 8 10
- 样例输出
-
1 10
(以下横纵坐标为区间的左端点和右端点)
这道题做的我心力交瘁。。。一开始超时。。。数组开小了(orz)
后来8分(满分十分)。。我读取一个区间都判断这个区间的左端点和上一个区间的右端点是否有重叠。。。
然后发现每加入一个区间都要判断这个区间的左端点和现在已知的最大右端点是否有重合 有 则说明可以合并 否则不可
如 (1,4),(2,6),现在已知最大右端点是4,则再加入(7,8)时,因为7大于现在最大右端点所以不能合并。
【代码】1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<algorithm> 5 using namespace std; 6 struct qj 7 { 8 int x,y; 9 }a[500009]; 10 bool cmp(qj i,qj j)//排序 11 { 12 if(i.x!=j.y)return i.x<j.x; 13 return i.y<j.y; 14 } 15 int z,y,n,maxx=0;//maxx记录横坐标的最大值 16 bool f(); 17 int main() 18 { 19 scanf("%d",&n); 20 for(int i=1;i<=n;i++) 21 { 22 scanf("%d%d",&a[i].x,&a[i].y); 23 if(maxx<a[i].y)maxx=a[i].y;//找横坐标最大值 24 } 25 26 sort(a+1,a+n+1,cmp);//横坐标升序排列 27 if(f())//能合并 28 cout<<z<<" "<<y<<endl;//输出 29 else 30 cout<<"no"<<endl; 31 return 0; 32 } 33 bool f() 34 { 35 z=a[1].x; y=a[1].y;//记录第一个的横纵坐标,y记录当前知道的最大纵坐标 36 for(int i=2;i<=n;i++) 37 { 38 if(a[i].x<=y)//如果当前区间的横坐标比当前已知最大纵坐标小 39 { 40 y=a[i].y>y?a[i].y:y;//说明可以合并,修改当前已知最大纵坐标 41 } 42 else 43 return 0;//不能合并 44 } 45 return 1; 46 }