| ||||||||||
| 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 | |||||||||
搜索+小根堆。。。居然16ms没想到会有这么快。。。。
本人习惯堆排用dp。。。不要在意细节
写的略渣
。。。。。。。。。。。。。。。。。。。。。。。。
type
arr=record
num:longint;
dp:array[1..110,1..2] of longint;
end;
var
a:array[0..110] of arr;
b:array[0..11000,1..3] of longint;
where:array[0..11000] of longint;
n,i,j,k,l,s,m,x,y,sum,p,t:longint;
v:double;
f:boolean;
procedure swap(var a,b:longint);
var
c:longint;
begin
c:=a;
a:=b;
b:=c;
end;
procedure up(t,x:longint);
begin
if x=1 then exit;
with a[t] do
if dp[x,1]<dp[x shr 1,1] then
begin
swap(where[dp[x,2]],where[dp[x shr 1,2]]);
swap(dp[x,1],dp[x shr 1,1]);
swap(dp[x,2],dp[x shr 1,2]);
up(t,x shr 1);
end;
end;
procedure down(t,x:longint);
begin
with a[t] do
begin
if x shl 1>num then exit;
if x shl 1=num then
begin
if dp[x,1]>dp[x shl 1,1] then
begin
swap(where[dp[x,2]],where[dp[x shl 1,2]]);
swap(dp[x,1],dp[x shl 1,1]);
swap(dp[x,2],dp[x shl 1,2]);
end;
exit;
end;
if dp[x shl 1,1]<dp[x shl 1+1,1] then
begin
if dp[x,1]>dp[x shl 1,1] then
begin
swap(where[dp[x,2]],where[dp[x shl 1,2]]);
swap(dp[x,1],dp[x shl 1,1]);
swap(dp[x,2],dp[x shl 1,2]);
down(t,x shl 1);
end;
end
else
begin
if dp[x,1]>dp[x shl 1+1,1] then
begin
swap(where[dp[x,2]],where[dp[x shl 1+1,2]]);
swap(dp[x,1],dp[x shl 1+1,1]);
swap(dp[x,2],dp[x shl 1+1,2]);
down(t,x shl 1+1);
end;
end;
end;
end;
procedure sort(l,r: longint);
var i,j,x,y: longint;
begin
i:=l;j:=r;x:=b[(l+r) div 2,1];
repeat
while b[i,1]<x do inc(i);
while x<b[j,1] do dec(j);
if not(i>j)
then begin
swap(a[b[i,3]].dp[where[i],2],a[b[j,3]].dp[where[j],2]);
swap(b[i,1],b[j,1]);
swap(b[i,2],b[j,2]);
swap(b[i,3],b[j,3]);
swap(where[i],where[j]);
inc(i);dec(j);
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
begin
read(s);
for l:=1 to s do
begin
read(n);
m:=0;
for i:=1 to n do
begin
read(k);
for j:=1 to k do
begin
read(x,y);
inc(m);
b[m,1]:=x;
b[m,2]:=y;
b[m,3]:=i;
with a[i] do
begin
num:=j;
dp[j,1]:=y;
dp[j,2]:=m;
end;
where[m]:=j;
up(i,j);
end;
end;
sort(1,m);
v:=0;
i:=1;
f:=true;
while (i<=m)and(f) do
begin
for j:=i+1 to m+1 do
if b[j,1]<>b[i,1] then break;
for k:=i to j-1 do
begin
p:=b[k,1];
sum:=b[k,2];
for x:=1 to b[k,3]-1 do
inc(sum,a[x].dp[1,1]);
for x:=b[k,3]+1 to n do
inc(sum,a[x].dp[1,1]);
if p/sum>v then v:=p/sum;
end;
for k:=i to j-1 do
begin
x:=b[k,3];
y:=where[k];
if where[k]=a[x].num then
begin
dec(a[x].num);
if a[x].num=0 then begin f:=false; break; end;
continue;
end;
a[x].dp[y]:=a[x].dp[a[x].num];
dec(a[x].num);
if a[x].num=0 then
begin f:=false; break; end;
where[a[x].dp[y,2]]:=y;
t:=a[x].dp[y,2];
up(x,y);
down(x,where[t]);
end;
i:=j;
end;
writeln(v:0:3);
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator