Đề bài:
Thuật toán:
- (đang cập nhập)
Code:
uses math;
const fi='';
fo='';
maxn=1000+3;
type
dinh =record
x,y:longint;
end;
arr1 =array[1..maxn] of dinh;
var a :array[1..maxn,1..maxn] of dinh;
s :array[1..maxn] of int64;
i,j,n,m,k :longint;
c :array[1..maxn] of longint;
sodinh :array[1..maxn] of longint;
khoang :array[1..maxn] of int64;
res :int64;
dem :array[1..maxn] of longint;
procedure enter;
begin
assign(input,fi);reset(input);
read(m,k);
for i:=1 to m do
begin
read(sodinh[i],c[i]);
for j:=1 to sodinh[i] do read(a[i,j].x,a[i,j].y);
end;
close(input);
end;
procedure swap(var x,y:int64);
var tg :int64;
begin
tg:=x;x:=y;y:=tg;
end;
procedure swap2(var x,y:longint);
var tg :longint;
begin
tg:=x;x:=y;y:=tg;
end;
procedure qs(l,r:longint);
var x:extended;
i,j:longint;
begin
i:=l;j:=r;
x:=s[(l+r) div 2];
repeat
while xs[j] do dec(j);
if i<=j then
begin
swap(s[i],s[j]);
swap2(c[i],c[j]);
inc(i);dec(j);
end;
until i>j;
if il then qs(l,j);
end;
function dientich(p:arr1;n:longint):int64;
var i :longint;
begin
dientich := 0;
p[n+1] := p[1];
for i:=1 to n do
dientich:= dientich + int64( (p[i+1].x-p[i].x) )*(p[i+1].y+p[i].y);
dientich:= abs(dientich){/2};
end;
procedure tinhs;
var i:longint;
begin
for i:=1 to m do
s[i]:=dientich(a[i],sodinh[i]);
end;
procedure chuanbi;
begin
sodinh[n+1]:=4;
a[n+1,1].x:=1;
a[n+1,1].y:=1;
a[n+1,2].x:=1;
a[n+1,2].y:=1;
a[n+1,3].x:=1;
a[n+1,3].y:=1;
a[n+1,4].x:=1;
a[n+1,4].y:=1;
end;
procedure process;
var maxc,sokhoang :longint;
dientich :int64;
begin
tinhs;
s[m+1]:=0;
qs(1,m+1);
for i:=1 to m do
khoang[i]:=s[i]-s[i+1];
for i:=1 to m do
begin
fillchar(dem,sizeof(dem),0); dientich := 0; maxc :=1; sokhoang :=1;
inc(dem[c[i]]);
dientich := dientich + khoang[i]; if dientich>res then res := dientich;
for j := i+1 to m do
begin
inc(dem[c[j]]); inc(sokhoang);
maxc := max(maxc,dem[c[j]]);
if sokhoang-maxc<=k then
begin
dientich := dientich + khoang[j];
if dientich>res then res := dientich;
end else break;
end;
end;
end;
procedure print;
begin
assign(output,fo);rewrite(output);
write(res{:0:1} div 2);
if odd(res) then
write('.5') else write('.0');
close(output);
end;
begin
enter;
process;
print;
end.
Speak Your Mind