prz

来源:互联网 发布:清华计算机系课程知乎 编辑:程序博客网 时间:2024/05/22 13:29

题目描述

   给定n个闭区间 [ai,bi], i=1,2,...,n. 这些区间的和可以用两两不相交的闭区间的和来表示。你的任务是找到这样的区间数目最少的表示,且把它们按升序的方式写到输出文件中。当且仅当a <= b < c <= d时,区间[a; b] 、[c; d]才是升序

写一个程序完成以下任务:

prz.in中读取区间

计算出满足上述条件的两两不相交的区间

把找到的区间按升序写入到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 410 106 98 10

样例输出

1 45 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.


0 0
原创粉丝点击