1489. 区间 (File IO): input:prz.in output:prz.out 时间限制: 1000 ms 空间限制: 262144 KB 具体限制 Goto ProblemSet 题目描述 给定n个闭区间 [ai,bi], i=1,2,...,n. 这些区间的和可以用两两不相交的闭区间的和来表示。你的任务是找到这样的区间数目最少的表示,且把它们按升序的方式写到输出文件中。当且仅当a <= b < c <= d时,区间[a; b] 、[c; d]才是升序 写一个程序完成以下任务: l 从 prz. in 中读取区间 l 计算出满足上述条件的两两不相交的区间 l 把找到的区间按升序写入到prz. OUT 中 输入 输入文件 prz. in 的第一行只有一个数n, 3 <= n <= 50000,代表区间数.第I+1行有两个数ai,bi,之间用一个空格隔开,分别表示区间[ai,bi]的起始和结束(1 <= i <= n),1 <= ai <= bi <= 1000000 输出 输出文件 prz. out 应该包含计算出的所有区间,每行写一个区间,每行只有两个数,分别是区间起始和结束,之间用一个空格分开。记住必须是按升序输出。 样例输入 5 5 6 1 4 10 10 6 9 8 10 样例输出 1 4 5 10 数据范围限制 uses math; var a,b,c,i,j:longint; v:array[0..50000,1..2]of longint; p:boolean; procedure ss(l,r:longint); var i,j,mid,mid1:longint; begin i:=l; j:=r; mid:=v[(i+j) div 2,1]; mid1:=v[(i+j) div 2,2]; while i<j do begin while (v[i,1]<mid)or((v[i,1]=mid)and(v[i,2]<mid1)) do inc(i); while (v[j,1]>mid)or((v[j,1]=mid)and(v[j,2]>mid1)) do dec(j); if i<=j then begin v[0]:=v[i]; v[i]:=v[j]; v[j]:=v[0]; inc(i); dec(j); end; end; if j>l then ss(l,j); if i<r then ss(i,r); end; begin assign(input,'prz.in');reset(input); assign(output,'prz.out');rewrite(output); readln(a); for b:=1 to a do begin readln(v[b,1],v[b,2]); i:=v[b,1]; j:=v[b,2]; v[b,1]:=min(i,j); v[b,2]:=max(i,j); end; ss(1,a); for b:=1 to a do begin if p=true then begin if (v[b,1]>=i)and(v[b,1]<=j) then begin j:=max(v[b,2],j); end else begin p:=false; writeln(i,' ',j); end; end; if p=false then begin i:=v[b,1]; j:=v[b,2]; p:=true; end; end; writeln(i,' ',j); close(input); close(output); end.