万变不离其宗
只要搞清楚题目的基本模型
搞清楚边是一种推导出的关系
搞清楚里面的逻辑关系
那就没什么难的了……
二分+sat,没什么好说的

1 const inf=100000007; 2 3 type node=record 4 5 point,next:longint; 6 7 end; 8 9 var edge:array[0..4000010] of node; 10 11 v,f:array[0..1010] of boolean; 12 13 x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[0..1010] of longint; 14 15 sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint; 16 17 18 19 function min(a,b:longint):longint; 20 21 begin 22 23 if a>b then exit(b) else exit(a); 24 25 end; 26 27 28 29 function max(a,b:longint):longint; 30 31 begin 32 33 if a>b then exit(a) else exit(b); 34 35 end; 36 37 38 39 function dis(i,j:longint):longint; 40 41 begin 42 43 exit(abs(x[i]-x[j])+abs(y[i]-y[j])); 44 45 end; 46 47 48 49 procedure add(x,y:longint); 50 51 begin 52 53 inc(len); 54 55 edge[len].point:=y; 56 57 edge[len].next:=p[x]; 58 59 p[x]:=len; 60 61 end; 62 63 64 65 procedure tarjan(x:longint); 66 67 var i,y:longint; 68 69 begin 70 71 inc(h); 72 73 inc(t); 74 75 dfn[x]:=h; 76 77 low[x]:=h; 78 79 f[x]:=true; 80 81 v[x]:=true; 82 83 st[t]:=x; 84 85 i:=p[x]; 86 87 while i<>-1 do 88 89 begin 90 91 y:=edge[i].point; 92 93 if not v[y] then 94 95 begin 96 97 tarjan(y); 98 99 low[x]:=min(low[x],low[y]); 100 101 end 102 103 else if f[y] then low[x]:=min(low[x],low[y]); 104 105 i:=edge[i].next; 106 107 end; 108 109 if dfn[x]=low[x] then 110 111 begin 112 113 inc(sum); 114 115 while st[t+1]<>x do 116 117 begin 118 119 y:=st[t]; 120 121 f[y]:=false; 122 123 be[y]:=sum; 124 125 dec(t); 126 127 end; 128 129 end; 130 131 end; 132 133 134 135 function check(k:longint):boolean; 136 137 var i,x,y,j:longint; 138 139 begin 140 141 len:=0; 142 143 fillchar(p,sizeof(p),255); 144 145 fillchar(v,sizeof(v),false); 146 147 fillchar(st,sizeof(st),0); 148 149 fillchar(be,sizeof(be),0); 150 151 for i:=1 to a do 152 153 begin 154 155 x:=hx[i]; 156 157 y:=hy[i]; 158 159 add(x,y+n); 160 161 add(x+n,y); 162 163 add(y+n,x); 164 165 add(y,x+n); 166 167 end; 168 169 for i:=1 to b do 170 171 begin 172 173 x:=fx[i]; 174 175 y:=fy[i]; 176 177 add(x,y); 178 179 add(y,x); 180 181 add(x+n,y+n); 182 183 add(y+n,x+n); 184 185 end; 186 187 for i:=1 to n-1 do 188 189 for j:=i+1 to n do 190 191 begin 192 193 if w1[i]+w1[j]>k then 194 195 begin 196 197 add(j,i+n); 198 199 add(i,j+n); 200 201 end; 202 203 if w2[i]+w2[j]>k then 204 205 begin 206 207 add(i+n,j); 208 209 add(j+n,i); 210 211 end; 212 213 if w1[i]+w+w2[j]>k then 214 215 begin 216 217 add(i,j); 218 219 add(j+n,i+n); 220 221 end; 222 223 if w2[i]+w+w1[j]>k then 224 225 begin 226 227 add(i+n,j+n); 228 229 add(j,i); 230 231 end; 232 233 end; 234 235 sum:=0; 236 237 for i:=1 to 2*n do 238 239 if not v[i] then 240 241 begin 242 243 h:=0; 244 245 t:=0; 246 247 tarjan(i); 248 249 end; 250 251 252 253 for i:=1 to n do 254 255 if be[i]=be[i+n] then exit(false); 256 257 exit(true); 258 259 end; 260 261 262 263 begin 264 265 readln(n,a,b); 266 267 l:=inf; 268 269 r:=0; 270 271 readln(x[n+1],y[n+1],x[n+2],y[n+2]); 272 273 w:=dis(n+1,n+2); 274 275 for i:=1 to n do 276 277 begin 278 279 readln(x[i],y[i]); 280 281 w1[i]:=dis(i,n+1); 282 283 w2[i]:=dis(i,n+2); 284 285 l:=min(l,min(w1[i],w2[i])); 286 287 r:=max(r,max(w1[i],w2[i])); 288 289 end; 290 291 r:=r shl 1+w; 292 293 for i:=1 to a do 294 295 readln(hx[i],hy[i]); 296 297 for i:=1 to b do 298 299 readln(fx[i],fy[i]); 300 301 ans:=inf; 302 303 while l<=r do 304 305 begin 306 307 m:=(l+r) shr 1; 308 309 if check(m) then 310 311 begin 312 313 ans:=m; 314 315 r:=m-1; 316 317 end 318 319 else l:=m+1; 320 321 end; 322 323 if ans=inf then writeln(-1) else writeln(ans); 324 325 end. 326 327 328 329 330 const inf=100000007; 331 type node=record 332 point,next:longint; 333 end; 334 var edge:array[0..4000010] of node; 335 v,f:array[0..1010] of boolean; 336 x,y,be,w1,w2,hx,hy,fx,fy,p,st,dfn,low:array[0..1010] of longint; 337 sum,w,l,r,ans,a,b,i,n,m,len,h,t:longint; 338 339 function min(a,b:longint):longint; 340 begin 341 if a>b then exit(b) else exit(a); 342 end; 343 344 function max(a,b:longint):longint; 345 begin 346 if a>b then exit(a) else exit(b); 347 end; 348 349 function dis(i,j:longint):longint; 350 begin 351 exit(abs(x[i]-x[j])+abs(y[i]-y[j])); 352 end; 353 354 procedure add(x,y:longint); 355 begin 356 inc(len); 357 edge[len].point:=y; 358 edge[len].next:=p[x]; 359 p[x]:=len; 360 end; 361 362 procedure tarjan(x:longint); 363 var i,y:longint; 364 begin 365 inc(h); 366 inc(t); 367 dfn[x]:=h; 368 low[x]:=h; 369 f[x]:=true; 370 v[x]:=true; 371 st[t]:=x; 372 i:=p[x]; 373 while i<>-1 do 374 begin 375 y:=edge[i].point; 376 if not v[y] then 377 begin 378 tarjan(y); 379 low[x]:=min(low[x],low[y]); 380 end 381 else if f[y] then low[x]:=min(low[x],low[y]); 382 i:=edge[i].next; 383 end; 384 if dfn[x]=low[x] then 385 begin 386 inc(sum); 387 while st[t+1]<>x do 388 begin 389 y:=st[t]; 390 f[y]:=false; 391 be[y]:=sum; 392 dec(t); 393 end; 394 end; 395 end; 396 397 function check(k:longint):boolean; 398 var i,x,y,j:longint; 399 begin 400 len:=0; 401 fillchar(p,sizeof(p),255); 402 fillchar(v,sizeof(v),false); 403 fillchar(st,sizeof(st),0); 404 fillchar(be,sizeof(be),0); 405 for i:=1 to a do 406 begin 407 x:=hx[i]; 408 y:=hy[i]; 409 add(x,y+n); 410 add(x+n,y); 411 add(y+n,x); 412 add(y,x+n); 413 end; 414 for i:=1 to b do 415 begin 416 x:=fx[i]; 417 y:=fy[i]; 418 add(x,y); 419 add(y,x); 420 add(x+n,y+n); 421 add(y+n,x+n); 422 end; 423 for i:=1 to n-1 do 424 for j:=i+1 to n do 425 begin 426 if w1[i]+w1[j]>k then 427 begin 428 add(j,i+n); 429 add(i,j+n); 430 end; 431 if w2[i]+w2[j]>k then 432 begin 433 add(i+n,j); 434 add(j+n,i); 435 end; 436 if w1[i]+w+w2[j]>k then 437 begin 438 add(i,j); 439 add(j+n,i+n); 440 end; 441 if w2[i]+w+w1[j]>k then 442 begin 443 add(i+n,j+n); 444 add(j,i); 445 end; 446 end; 447 sum:=0; 448 for i:=1 to 2*n do 449 if not v[i] then 450 begin 451 h:=0; 452 t:=0; 453 tarjan(i); 454 end; 455 456 for i:=1 to n do 457 if be[i]=be[i+n] then exit(false); 458 exit(true); 459 end; 460 461 begin 462 readln(n,a,b); 463 l:=inf; 464 r:=0; 465 readln(x[n+1],y[n+1],x[n+2],y[n+2]); 466 w:=dis(n+1,n+2); 467 for i:=1 to n do 468 begin 469 readln(x[i],y[i]); 470 w1[i]:=dis(i,n+1); 471 w2[i]:=dis(i,n+2); 472 l:=min(l,min(w1[i],w2[i])); 473 r:=max(r,max(w1[i],w2[i])); 474 end; 475 r:=r shl 1+w; 476 for i:=1 to a do 477 readln(hx[i],hy[i]); 478 for i:=1 to b do 479 readln(fx[i],fy[i]); 480 ans:=inf; 481 while l<=r do 482 begin 483 m:=(l+r) shr 1; 484 if check(m) then 485 begin 486 ans:=m; 487 r:=m-1; 488 end 489 else l:=m+1; 490 end; 491 if ans=inf then writeln(-1) else writeln(ans); 492 end.