| ||||||||||
| 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 | |||||||||
蒟蒻求解 3016 或者求数据本地对拍了上万组数据没有一个错了,各种数据都差不多有
然后交就WA,求神牛解答.
如果有闲心可以检查一下蒟蒻的代码
Source Code
Problem: 3016 User: Hoblovski
Memory: N/A Time: N/A
Language: Pascal Result: Wrong Answer
Source Code
{$INLINE ON}
program poj3016;
type pnode=^tnode;
tnode=record
v,d:longint;
l,r:pnode;
end;
const maxn=1017;
maxm=17;
var s,len,isum,osum,icnt,ocnt:array[0..maxn] of longint;
cost:array[0..maxn,0..maxn] of longint;
f:array[0..maxn,0..maxm] of longint;
que:array[0..maxn*5] of pnode;
node:array[0..maxn] of pnode;
n,m,rer,rer0:longint;
null:pnode;
function min(i,j:longint):longint; inline; begin
if i<j then exit(i) else exit(j); end;
procedure leftheap_init(n:longint);
var i:longint;
begin
new(null); with null^ do begin
v:=0; d:=-1; l:=null; r:=null;
end; filldword(node,(n+1),longint(null));
end;
function merge(var i,j:pnode):pnode; inline;
begin
if i=null then exit(j);
if j=null then exit(i);
if j^.v>i^.v then begin
merge:=i; i:=j; j:=merge;
end;
i^.r:=merge(i^.r,j);
if i^.l^.d<i^.r^.d then begin
merge:=i^.l; i^.l:=i^.r; i^.r:=merge;
end; i^.d:=i^.r^.d+1; exit(i);
end;
function exmax(var i:pnode):pnode; inline;
begin
exmax:=i; i:=merge(i^.l,i^.r);
end;
procedure getcost(st:longint);
var i,j:longint;
k:int64;
begin
rer:=0; k:=0; rer0:=0;
fillchar(isum,sizeof(isum),0); fillchar(osum,sizeof(osum),0);
fillchar(icnt,sizeof(icnt),0); fillchar(ocnt,sizeof(ocnt),0);
fillchar(len,sizeof(len),0);
for i:=st to n do begin
inc(rer); new(node[rer]); inc(rer0); que[rer0]:=node[rer];
with node[rer]^ do begin
v:=s[i]; d:=0; l:=null; r:=null;
end; len[rer]:=1;
icnt[rer]:=1; ocnt[rer]:=0;
isum[rer]:=s[i]; osum[i]:=0;
while (rer>1)and(node[rer-1]^.v>=node[rer]^.v) do begin
dec(k,icnt[rer]*node[rer]^.v -isum[rer] +osum[rer] -ocnt[rer]*node[rer]^.v);
dec(k,icnt[rer-1]*node[rer-1]^.v-isum[rer-1]+osum[rer-1]-ocnt[rer-1]*node[rer-1]^.v);
dec(rer); inc(len[rer],len[rer+1]); node[rer]:=merge(node[rer],node[rer+1]);
inc(icnt[rer],icnt[rer+1]); inc(ocnt[rer],ocnt[rer+1]);
inc(isum[rer],isum[rer+1]); inc(osum[rer],osum[rer+1]);
isum[rer+1]:=0; osum[rer+1]:=0; node[rer+1]:=null; icnt[rer+1]:=0; ocnt[rer+1]:=0; len[rer+1]:=0;
while (icnt[rer]>((len[rer]+1)>>1)) do begin
j:=exmax(node[rer])^.v;
dec(icnt[rer]); inc(ocnt[rer]);
dec(isum[rer],j); inc(osum[rer],j);
end;
inc(k,icnt[rer]*node[rer]^.v-isum[rer]+osum[rer]-ocnt[rer]*node[rer]^.v);
end;
cost[st,i]:=min(cost[st,i],k);
end; for i:=1 to rer0 do dispose(que[i]);
end;
function dp:longint;
var i,j,k:longint;
begin
f[0,0]:=0;
for i:=1 to n do
for j:=1 to m do
for k:=0 to i-1 do
f[i,j]:=min(f[i,j],f[k,j-1]+cost[k+1,i]);
exit(f[n,m]);
end;
function init:longint;
var i,j,k:longint;
begin
fillchar(cost,sizeof(cost),$3f);
fillchar(f,sizeof(f),$3f); readln(n,m);
if (n=0)and(m=0) then exit(-1)
else if (m>=n) then init:=1 else init:=0;
for i:=1 to n do read(s[i]); readln;
end;
procedure work;
var i,j:longint;
begin
for i:=1 to n do s[i]:=s[i]-i;
for i:=1 to n do getcost(i);
for i:=1 to n do s[i]:=-s[i]-(i<<1);
for i:=1 to n do getcost(i);
writeln(dp);
end;
begin
while not seekeof do begin
leftheap_init(0);
case init of
-1:break;
0:work;
1:writeln(0);
end;
end;
end.
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator