Garden
Description
LHX教主最近总困扰于前来膜拜他的人太多了,所以他给他的花园加上了一道屏障。
可以把教主的花园附近区域抽像成一个正方形网格组成的网络,每个网格都对应了一个坐标(均为整数,有可能为负),若两个网格(x1, y1),(x2, y2)有|x1 � x2| + |y1 � y2| = 1,则说这两个网格是相邻的,否则不是相邻的。
教主在y = 0处整条直线上的网格设置了一道屏障,即所有坐标为(x, 0)的网格。当然,他还要解决他自己与内部人员的进出问题,这样教主设置了N个入口a1, a2, …, aN可供进出,即对于y = 0上的所有网格,只有 (a1, 0),(a2, 0), ……, (aN, 0) 可以通过,之外的所有纵坐标为0的网格均不能通过,而对于(x, y)有y不为0的网格可以认为是随意通过的。
现在教主想知道,给定M个点对(x1, y1),(x2, y2),并且这些点均不在屏障上,询问从一个点走到另一个点最短距离是多少,每次只能从一个格子走到相邻的格子。
Input
输入的第1行为一个正整数N,为屏障上入口的个数。
第2行有N个整数,a1, a2, …, aN,之间用空格隔开,为这N个入口的横坐标。
第3行为一个正整数M,表示了M个询问。
接下来M行,每行4个整数x1, y1, x2, y2,有y1与y2均不等于0,表示了一个询问从(x1, y1)到(x2, y2)的最短路。
第2行有N个整数,a1, a2, …, aN,之间用空格隔开,为这N个入口的横坐标。
第3行为一个正整数M,表示了M个询问。
接下来M行,每行4个整数x1, y1, x2, y2,有y1与y2均不等于0,表示了一个询问从(x1, y1)到(x2, y2)的最短路。
Output
输出共包含m行,第i行对于第i个询问输出从(x1, y1)到(x2, y2)的最短路距离是多少。
2
2 -1
2
0 1 0 -1
1 1 2 2
4
2
1 var
2 a:array[1..100000] of int64;
3 i,b:longint;
4 x1,y1,x2,y2,f,n,s,t,tmp,ans,m:int64;
5 k:double;
6 procedure qs(s,t:longint);
7 var
8 i,j,x:longint;
9 begin
10 i:=s;
11 j:=t;
12 x:=a[i];
13 repeat
14 while (i<j) and (x<=a[j]) do dec(j);
15 if i<j then
16 begin
17 a[i]:=a[j];
18 inc(i);
19 end;
20 while (i<J) and (x>=a[i]) do inc(i);
21 if i<j then
22 begin
23 a[j]:=a[i];
24 dec(j);
25 end;
26 until i=j;
27 a[i]:=x;
28 inc(i);
29 dec(j);
30 if s<j then qs(s,j);
31 if i<T then qs(i,t);
32 end;
33 begin
34 readln(n);
35 for i:=1 to n do
36 read(a[i]);
37 qs(1,n);
38 readln(m);
39 for b:=1 to m do
40 begin
41 readln(x1,y1,x2,y2);
42 if y1*y2>0 then
43 writeln(abs(y2-y1)+abs(x2-x1))
44 else
45 begin
46 if x1=x2 then k:=x1
47 else
48 begin
49 k:=(y2-y1)/(x2-x1);
50 k:=x1-y1/k;
51 end;
52 s:=1;
53 t:=n;
54 while s<t do
55 begin
56 tmp:=(s+t+1) div 2;
57 if a[tmp]<k then s:=tmp
58 else t:=tmp-1;
59 end;
60 ans:=maxlongint;
61 if s=1 then inc(s);
62 for i:=s-1 to n do
63 begin
64 tmp:=abs(x1-a[i])+abs(y1)+abs(x2-a[i])+abs(y2);
65 if tmp<ans then ans:=tmp else break;
66 end;
67 writeln(ans);
68 end;
69 end;
70 end.
浙公网安备 33010602011771号