paranoid.pas

来自「Magio牛的usaco源代码」· PAS 代码 · 共 82 行

PAS
82
字号
{
PROG:paranoid
LANG:PASCAL
}

program paranoid;
const
  maxn=100000;
type
  interval=record
    start,finish,order:longint;
  end;
var
  fin,fout:text;
  int:array[1..maxn]of interval;
  n,l,r,try,i:longint;
procedure qsort(s,t:longint);
  var
    i,j,ran:longint;
    p:interval;
  begin
    if s>=t then exit;
    ran:=s+random(t-s+1);
    p:=int[ran];
    int[ran]:=int[s];
    i:=s;j:=t;
    repeat
      while (i<j) and (int[j].finish>=p.finish) do dec(j);
      if i=j then break;
      int[i]:=int[j];inc(i);
      while (i<j) and (int[i].finish<=p.finish) do inc(i);
      if i=j then break;
      int[j]:=int[i];dec(j);
    until i=j;
    int[i]:=p;
    qsort(s,i-1);
    qsort(i+1,t);
  end;
function ok(x:longint):boolean;
  var
    now,i:longint;
  begin
    now:=-1;
    for i:=1 to n do
      if int[i].order<=x then
        if int[i].start>now then
          now:=int[i].start
        else begin
          ok:=false;
          exit;
        end;
    ok:=true;
  end;
begin
  assign(fin,'paranoid.in');
  reset(fin);
  readln(fin,n);
  for i:=1 to n do begin
    readln(fin,int[i].start,int[i].finish);
    int[i].order:=i;
  end;
  close(fin);

  qsort(1,n);

  l:=1;r:=n;
  repeat
    try:=(l+r) div 2;
    if ok(try) then begin
      if try=n then break;
      if ok(try+1) then l:=try+1 else break;
    end
    else
      r:=try-1;
  until false;

  assign(fout,'paranoid.out');
  rewrite(fout);
  writeln(fout,try);
  close(fout);
end.

⌨️ 快捷键说明

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