| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:pascal 水 by yqk 感谢我吧 呵呵哈哈哈或或或或或In Reply To:pascal 水 by yqk 感谢我吧 呵呵哈哈哈或或或或或 Posted by:yangqikai at 2017-08-05 14:41:46 > var
> n:longint;
> a:array[0..50000,1..3]of longint;
> f:array[0..16]of longint;
> mi:array[0..50000,0..16,1..2]of longint;
> o:array[0..50000,1..3]of longint;
> procedure init;
> var
> i:longint;
> begin
> f[0]:=1;
> for i:=1 to 16 do
> f[i]:=f[i-1]*2;
> read(n);
> for i:=1 to n do
> begin
> readln(a[i,1],a[i,2]);
> a[i,3]:=i;
> end;
> end;
> procedure qsort(l,r:longint);
> var
> i,j,k:longint;
> begin
> if l>=r then exit;
> i:=l;
> j:=r;
> k:=a[(l+r) div 2,1];
> while i<j do
> begin
> while a[i,1]<k do inc(i);
> while a[j,1]>k do dec(j);
> if i<=j then
> begin
> a[0]:=a[i];
> a[i]:=a[j];
> a[j]:=a[0];
> inc(i);
> dec(j);
> end;
> end;
> qsort(l,j);
> qsort(i,r);
> end;
> procedure dfs(l,r:longint);
> var
> i,t,ft,lt,rt,x:longint;
> begin
> if r<=l then exit;
> t:=trunc(ln(r-l+1)/ln(2));
> if mi[l,t,1]<mi[r-f[t]+1,t,1] then x:=mi[l,t,2]
> else x:=mi[r-f[t]+1,t,2];
> ft:=a[x,3];
> lt:=0;
> if l<>x then
> begin
> t:=trunc(ln(x-l)/ln(2));
> if mi[l,t,1]<mi[x-f[t],t,1] then lt:=a[mi[l,t,2],3]
> else lt:=a[mi[x-f[t],t,2],3];
> end;
> rt:=0;
> if r<>x then
> begin
> t:=trunc(ln(r-x)/ln(2));
> if mi[x+1,t,1]<mi[r-f[t]+1,t,1] then rt:=a[mi[x+1,t,2],3]
> else rt:=a[mi[r-f[t]+1,t,2],3];
> end;
> o[ft,2]:=lt;
> o[ft,3]:=rt;
> o[lt,1]:=ft;
> o[rt,1]:=ft;
> dfs(l,x-1);
> dfs(x+1,r);
> end;
> procedure main;
> var
> i,b,t:longint;
> begin
> for i:=1 to n do mi[i,0,1]:=a[i,2];
> for i:=1 to n do mi[i,0,2]:=i;
> for t:=1 to trunc(ln(n)/ln(2)) do
> for b:=1 to n-f[t]+1 do
> if mi[b,t-1,1]>mi[b+f[t-1],t-1,1] then mi[b,t]:=mi[b+f[t-1],t-1]
> else mi[b,t]:=mi[b,t-1];
> dfs(1,n);
> end;
> procedure print;
> var
> i:longint;
> begin
> writeln('YES');
> for i:=1 to n do
> writeln(o[i,1],' ',o[i,2],' ',o[i,3]);
> end;
> begin
> init;
> qsort(1,n);
> main;
> print;
> end.
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator