zoukankan      html  css  js  c++  java
  • poj2749

    万变不离其宗

    只要搞清楚题目的基本模型

    搞清楚边是一种推导出的关系

    搞清楚里面的逻辑关系

    那就没什么难的了……

    二分+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.
    View Code
  • 相关阅读:
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    PTA —— 基础编程题目集 —— 函数题 —— 61 简单输出整数 (10 分)
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    练习2.13 不用库函数,写一个高效计算ln N的C函数
    迷宫问题 POJ 3984
    UVA 820 Internet Bandwidth (因特网带宽)(最大流)
    UVA 1001 Say Cheese(奶酪里的老鼠)(flod)
    UVA 11105 Semiprime Hnumbers(H半素数)
    UVA 557 Burger(汉堡)(dp+概率)
  • 原文地址:https://www.cnblogs.com/phile/p/4473210.html
Copyright © 2011-2022 走看看