ex2.dpr

来自「tongji acm-online judge solution」· DPR 代码 · 共 138 行

DPR
138
字号
(*
Used time : 0.64s
O(N log N)+O(N)+O(N^2)+O(N)=O(N^2)
            /|\
             |delete repeat (but without it still 0.64s)
???solution 1,used time > solution 2
*)
program Ural_1019(Input, Output);
const
    MaxN = 5000;
type
    TIndex = Longint;
    TSegments = array[0..MaxN] of record
        l, r: TIndex;
        c: Boolean;
    end;
    TPoint = record
        Status: TIndex;
        Point: TIndex;
    end;
    TPoints = array[1..MaxN * 2 + 2] of TPoint;
var
    S: TSegments;
    P: TPoints;
    N, Len: TIndex;

procedure Sift(l, r: TIndex);
var
    i, j: TIndex;
    tmp: TPoint;
begin
    i := l;
    j := i * 2;
    tmp := P[l];
    while j <= r do
    begin
        if (j < r) and (P[j].Point < P[j + 1].Point) then
            Inc(j);
        if tmp.Point >= P[j].Point then
            Break
        else
        begin
            P[i] := P[j];
            i := j;
            j := i * 2;
        end;
    end;
    P[i] := tmp;
end;

procedure HeapSort;
var
    i: TIndex;
    tmp: TPoint;
begin
    for i := Len div 2 downto 1 do
        Sift(i, Len);
    for i := Len downto 1 do
    begin
        tmp := P[1];
        P[1] := P[i];
        P[i] := tmp;
        Sift(1, i - 1);
    end;
end;

procedure Main;
var
    i, j: TIndex;
    Ch: Char;
    Len_, MaxLeft, MaxRight, Max: TIndex;
begin
    FillChar(P, SizeOf(P), 0);
    FillChar(S, SizeOf(S), 0);
    P[1].Point := 0;
    P[2].Point := 1000000000;
    S[0].l := 0;
    S[0].r := 1000000000;
    S[0].c := false;
    Readln(N);
    for i := 1 to N do
    begin
        Read(S[i].l, S[i].r);
        repeat
            Read(Ch);
        until Ch in ['b', 'w'];
        S[i].c := (Ch = 'b');
        Readln;
        P[i * 2 + 1].Point := S[i].l;
        P[i * 2 + 2].Point := S[i].r;
    end;
    Len := 2 * N + 2;
    HeapSort;
    Len_ := Len;
    Len := 0;
    i := 1;
    while i <= Len_ do
    begin
        Inc(Len);
        P[Len] := P[i];
        Inc(i);
        while (P[i].Point = P[Len].Point) and (i <= Len_) do
            Inc(i);
    end;    
    for i := N downto 0 do
        for j := 1 to Len - 1 do
            if (S[i].l <= P[j].Point) and (P[j + 1].Point <= S[i].r) and (P[j].Status = 0) then
                P[j].Status := Ord(S[i].c) + 1;
    MaxLeft := -1;
    MaxRight := -1;
    Max := 0;
    i := 1;
    while i <= Len - 1 do //Len-1
    begin
        j := i;
        while P[i].Status = P[j + 1].Status do //P[Len].status=0
            Inc(j);
        if (P[j + 1].Point - P[i].Point > Max) and (P[i].Status = 1) then
        begin
            MaxLeft := P[i].Point;
            MaxRight := P[j + 1].Point;
            Max := P[j + 1].Point - P[i].Point;
        end;
        i := j + 1;
    end;
    Writeln(MaxLeft, ' ', MaxRight);
end;
begin
   { Assign(Input, 'i.txt');
    Reset(Input);
    Assign(Output, 'o.txt');
    Rewrite(Output); }
    Main;
   { Close(Input);
    Close(Output); }
end.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?