test on 20111029

两个半小时做完了..
题目是温州中学模拟赛Day2

第一题 light:
[cc inline="true" lang="Pascal"]program light;
const
maxn=100010;
type
arr=array[0..maxn] of real;

var
x,y,dis:arr;
a,b,d:real;
n,i,j,ans:longint;
p1:real;

procedure init;
begin
assign(input,'light.in');reset(input);
assign(output,'light.out');rewrite(output);
end;
procedure quit;
begin
close(input);
close(output);
end;

procedure swap(a1,a2:longint);
var
t1:real;
begin
t1:=dis[a1];
dis[a1]:=dis[a2];
dis[a2]:=t1;
end;

procedure qsort(p,r:longint);
var
i1,j1:longint;
begin
i1:=random(r-p)+p;
swap(i1,r);
j1:=p-1;
for i1:=p to r-1 do
if dis[i1] begin
inc(j1);
swap(j1,i1);
end;
inc(j1);
swap(j1,r);
if p qsort(p,j1-1);
if j1+1 qsort(j1+1,r);
end;
begin
init;

readln(a,b,d,n);
p1:=sqrt(a*a+b*b);
for i:=1 to n do
readln(x[i],y[i]);
for i:=1 to n do
dis[i]:=(a*x[i]+b*y[i])/p1;
qsort(1,n);
ans:=0;
i:=1;
j:=1;
d:=d*2;
while true do
begin
while (jans then
ans:=j-i;
if j>n then
break;
while (id) do
inc(i);
end;
writeln(ans);

quit;
end.
[/cc]

第二题 friends,这题写太长了,我好渣渣。。。
[cc inline="true" lang="Pascal"]program friends;
const
maxn=100010;
oo=20070128;

type
link=^node;
node=record
d1,d2:longint;
next:link;
end;
arr=array[0..maxn] of longint;
arr1=array[0..maxn] of link;
arr2=array[0..maxn] of boolean;

var
n,i:longint;
du:arr;
ed:arr1;
p1,p2,p3:longint;
q:arr;
head,tail:longint;
vi,ok:arr2;
u,v,x:longint;
l1,l2:link;
ans:longint;

procedure init;
begin
assign(input,'friends.in');reset(input);
assign(output,'friends.out');rewrite(output);
end;
procedure quit;
begin
close(input);
close(output);
end;

procedure insert(a1,a2,a3:longint);
var
t1:link;
begin
new(t1);
t1^.d1:=a2;
t1^.d2:=a3;
t1^.next:=nil;
if ed[a1]<>nil then
t1^.next:=ed[a1];
ed[a1]:=t1;
inc(du[a1]);
end;
procedure noans;
begin
writeln('no answer');
quit;
halt;
end;
procedure enqueue(key:longint);
begin
q[tail]:=key;
tail:=(tail mod maxn)+1;
vi[key]:=true;
end;
procedure dequeue(var key:longint);
begin
key:=q[head];
head:=(head mod maxn)+1;
end;
function min(a1,a2:longint):longint;
begin
if a1>a2 then
exit(a2)
else
exit(a1);
end;
function max(a1,a2:longint):longint;
begin
if a1>=a2 then
exit(a1)
else
exit(a2);
end;
function dfs(now,ft,ws,bq:longint):longint;
var
q1:link;
pp:longint;

begin
q1:=ed[now];
while (q1^.next<>nil)and(ok[q1^.d1]or((ft=0)and vi[q1^.d1])or(q1^.d1=bq)) do
q1:=q1^.next;
if ((ft=0)and vi[q1^.d1]) or ok[q1^.d1] then
exit(oo);

if ft=0 then
begin
vi[now]:=true;
pp:=dfs(q1^.d1,ft,1-ws,oo);
if ws=0 then
exit(min(pp,q1^.d2))
else
exit(pp);
end
else
begin
ok[now]:=true;
pp:=dfs(q1^.d1,ft,1-ws,oo);
if ws=0 then
exit(min(pp,q1^.d2))
else
exit(pp);
end;

end;

begin
init;

readln(n);
if (n and 1)=1 then
noans;
fillchar(du,sizeof(du),0);
for i:=1 to n do
ed[i]:=nil;

for i:=1 to n do
begin
readln(p1,p2,p3);
insert(p1,p2,p3);
insert(p2,p1,p3);
end;
head:=1;
tail:=1;
fillchar(vi,sizeof(vi),false);
fillchar(ok,sizeof(ok),false);
for i:=1 to n do
if du[i]=0 then
noans
else if du[i]=1 then
enqueue(i);
ans:=oo;
while head<>tail do
begin
dequeue(u);
if ok[u] then
continue;
l1:=ed[u];
while (l1^.next<>nil)and(ok[l1^.d1]) do
l1:=l1^.next;
v:=l1^.d1;
ans:=min(ans,l1^.d2);
l1:=ed[v];
ok[u]:=true;
ok[v]:=true;
while l1<>nil do
begin
x:=l1^.d1;
if not ok[x] then
begin
dec(du[x]);
if du[x]=1 then
enqueue(x)
else if du[x]=0 then
noans;
end;
l1:=l1^.next;
end;

end;
if ans=oo then
ans:=0;
fillchar(vi,sizeof(vi),false);
for i:=1 to n do
if not ok[i] then
begin
ans:=max(ans,dfs(i,0,0,oo));
l1:=ed[i];
while ok[l1^.d1] do
l1:=l1^.next;
ans:=max(ans,dfs(l1^.d1,1,0,i));
end;
writeln(ans);
quit;
end.
[/cc]

第三题 cut 用了ST哦~
[cc inline="true" lang="Pascal"]program cut;
const
maxn=1000020;
type
arr=array[0..maxn] of longint;
arr1=array[0..maxn,0..20] of longint;
var
k:array[1..3] of longint;
n,m,i,j:longint;
h:arr;
p1,p2,p3,p4,p5:longint;
q:longint;
st:arr1;

procedure init;
begin
assign(input,'cut.in');reset(input);
assign(output,'cut.out');rewrite(output);
end;
procedure quit;
begin
close(input);
close(output);
end;
function min(a1,a2:longint):longint;
begin
if a1 exit(a1)
else
exit(a2);
end;

begin
init;

readln(k[1],k[2],k[3]);
readln(n);
for i:=1 to n do
read(h[i]);
readln;
readln(m);
for i:=1 to m do
begin
readln(p1,p2,p3,p4);
for j:=p1 to p2 do
begin
p5:=k[p3]*j+p4;
if p5 h[j]:=p5;
end;
end;
readln(q);

for i:=1 to n do
st[i,0]:=h[i];
for j:=1 to trunc(ln(n)/ln(2)) do
for i:=1 to (n-(1 shl j)+1) do
st[i,j]:=min(st[i,j-1],st[i+(1 shl(j-1)),j-1]);
for i:=1 to q do
begin
readln(p1,p2);
p3:=trunc(ln(p2-p1)/ln(2));
p4:=min(st[p1,p3],st[p2-(1 shl p3)+1,p3]);
writeln(p4);
end;

quit;
end.
[/cc]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注