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
  • 相关阅读:
    Liferay 6.2 改造系列之十五:修改默认可用语言
    Liferay 6.2 改造系列之十七:当Portlet无权限时,不显示错误信息
    Liferay 6.2 改造系列之十四:修改组织的表单内容
    Liferay 6.2 改造系列之十三:修改用户编辑页面表单内容
    Liferay 6.2 改造系列之十一:默认关闭CDN动态资源
    matlab向量的排序(自写函数)
    matlab求一个矩阵中各元素出现的个数(归一化)
    matlab求矩阵的鞍点
    matlab求矩阵、向量的模
    matlab求最大公约数和最小公倍数
  • 原文地址:https://www.cnblogs.com/phile/p/4473210.html
Copyright © 2011-2022 走看看