您的位置:首页 > 编程语言

[NOIP2015]代码

2015-11-23 19:59 148 查看
今年真是挂惨了。。。。。。

考场:

T1 magic AAAAAAAAAA

program _transport;
var
n,m:longint;
a,b,t:array[1..600000] of longint;
u,v:array[1..300000] of longint;
w:array[1..300000] of longint;
vis:array[1..300000] of boolean;
father:array[1..300000] of longint;
i,j,k,l,p:longint;
ans:int64;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
procedure qsort(l,r:longint);
var
i,j,x,y:longint;
begin
i:=l;
j:=r;
x:=a[(l+r) div 2];
repeat
while a[i]<x do
inc(i);
while a[j]>x do
dec(j);
if i<=j then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
y:=b[i]; b[i]:=b[j]; b[j]:=y;
y:=t[i]; t[i]:=t[j]; t[j]:=y;
inc(i); dec(j);
end;
until i>j;
if l<j then
qsort(l,j);
if i<r then
qsort(i,r);
end;
function checkline:boolean;
var
i:longint;
begin
if (a[1]<>1)or(b[1]<>2) then
exit(false);
if (a[2*n-2]<>n)or(b[2*n-2]<>n-1) then
exit(false);
for i:=2 to n-2 do
if ((a[i*2-2]<>i)or(b[i*2-2]<>i+1))and((a[i*2-1]<>i)or(b[i*2-1]<>i+1)) then
exit(false);
exit(true);
end;
function find(data,l,r:longint):longint;
var
mid:longint;
begin
mid:=(l+r) div 2;
if (a[mid]>=data)and(a[mid-1]>=data) then
exit(find(data,l,mid-1));
if (a[mid]<data) then
exit(find(data,mid+1,r));
if (a[mid]=data)and((mid=1)or(a[mid-1]<data)) then
exit(mid);
end;
procedure maketree(x:longint);
var
i,j,k:longint;
begin
vis[x]:=true;
j:=find(x,1,2*n-2);
if x=n then
k:=2*n-2
else
k:=find(x+1,1,2*n-2);
for i:=j to k-1 do
begin
if not(vis[b[i]]) then
begin
father[b[i]]:=x;
maketree(b[i]);
end;
end;
end;
function findfather(x,y:longint):longint;
var
i,lsx,lsy,sum:longint;
begin
fillchar(vis,sizeof(vis),0);
lsx:=x;
lsy:=y;
while x<>0 do
begin
vis[x]:=true;
x:=father[x];
end;
while y<>0 do
begin
if vis[y] then
break;
y:=father[y];
end;
sum:=0;
while lsx<>y do
begin
inc(sum,w[lsx]);
lsx:=father[lsx];
end;
while lsy<>y do
begin
inc(sum,w[lsy]);
lsy:=father[lsy];
end;
exit(sum);
end;
begin
assign(input,'transport.in');
reset(input);
assign(output,'transport.out');
rewrite(output);
readln(n,m);
for i:=1 to n-1 do
begin
readln(a[i],b[i],t[i]);
t[i+n-1]:=t[i];
a[i+n-1]:=b[i];
b[i+n-1]:=a[i];
end;
for i:=1 to m do
readln(u[i],v[i]);
qsort(1,2*n-2);
if checkline then
begin
fillchar(w,sizeof(w),0);
w[1]:=t[1];
w[n-1]:=t[2*n-2];
for i:=2 to n-2 do
begin
if (a[i*2-2]=i)and(b[i*2-2]=i+1) then
w[i]:=t[i*2-2]
else
w[i]:=t[i*2-1];
end;
ans:=$3f3f3f3f;
for i:=1 to n-1 do
begin
l:=0;
for j:=1 to m do
begin
p:=0;
for k:=u[j] to v[j]-1 do
begin
if k<>i then
p:=p+w[k];
end;
if l<p then
l:=p;
end;
if ans>l then
ans:=l;
end;
writeln(ans);
end
else
begin
fillchar(vis,sizeof(vis),0);
fillchar(father,sizeof(father),0);
maketree(1);
fillchar(w,sizeof(w),0);
for i:=1 to 2*n-2 do
if father[a[i]]=b[i] then
w[a[i]]:=t[i];
ans:=$3f3f3f3f;
for k:=2 to n do
begin
j:=0;
l:=w[k];
w[k]:=0;
for i:=1 to m do
begin
if findfather(u[i],v[i])>j then
j:=findfather(u[i],v[i]);
end;
if ans>j then
ans:=j;
w[k]:=l;
end;
writeln(ans);
end;
close(input);
close(output);
end.


transport.pas
其中大部分是不该失分的,正常水平应该在100+100+80(看常数,COGS上AC)+100+100+80=560......
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: