1539. 【USACO Open 2012铜】三条直线Three lines (File IO): input:3lines.in output:3lines.out 时间限制: 1000 ms 空间限制: 131072 KB 具体限制 Goto ProblemSet 题目描述 FJ想使用购买的新监控系统监视他的N头奶牛(1 <=N<= 50,000)。 第i头牛位置在(x_i, y_i),这是一对整数坐标,范围在0...1,000,000,000之内。FJ的监控系统有3个特殊的镜头,每一个镜头能够观察垂直或者水平的一行。 请决定FJ是否有可能架设这3个镜头,使他能够观察到所有的N头牛。也就是说,请决定N头牛的位置是否能同时被3条直线所覆盖。这3条直线必须是垂直或者水平的。 输入 第1行:1个整数N 第2..N+1行:2个整数x_i和y_i,表示第i头牛的坐标 输出 第1行:如果能监控所有的N头牛,则输出1,否则输出0 样例输入 6 1 7 0 0 1 2 2 0 1 4 3 4 样例输出 1 数据范围限制 type arr=array[1..5,1..2]of longint; var a,b,c:longint; v:array[0..50001,1..2]of longint; r:arr; bzz:boolean; function tt(i,j:longint;k:arr):longint; var b,c:longint; p:boolean; begin for b:=j to a do begin p:=false; for c:=1 to i-1 do if ((k[c,1]=1)and(k[c,2]=v[b,1]))or ((k[c,1]=2)and(k[c,2]=v[b,2])) then begin p:=true; break; end; if (p=false) then begin exit(b); bzz:=true; end; end; bzz:=false; exit(a+1); end; function pd(i,j:longint;k:arr):boolean; var a:longint; begin for a:=1 to i-1 do if ((k[a,1]=1)and(k[a,2]=v[j,1]))or ((k[a,1]=2)and(k[a,2]=v[j,2])) then exit(true); exit(false); end; procedure ss(i,j:longint;k:arr); var v1:arr; begin if j>a then begin if (i<=4) then begin writeln(1); halt; end; end else begin if (i>4) then exit; if pd(i,j,k)=true then begin ss(i,tt(i,j+1,k),k); exit; end; begin begin v1:=k; v1[i,1]:=1; v1[i,2]:=v[j,1]; ss(i+1,j+1,v1); end; begin v1:=k; v1[i,1]:=2; v1[i,2]:=v[j,2]; ss(i+1,j+1,v1); end; end; end; end; begin assign(input,'3lines.in');reset(input); assign(output,'3lines.out');rewrite(output); readln(a); for b:=1 to a do begin readln(v[b,1],v[b,2]); end; ss(1,1,r); writeln(0); close(input); close(output); end.