zoukankan      html  css  js  c++  java
  • 1018: [SHOI2008]堵塞的交通traffic

    Description

    有一天,由于某种穿越现象作用,你来到了传说中的小人国。小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总共有2C个城市和3C-2条道路。 小人国的交通状况非常槽糕。有的时候由于交通堵塞,两座城市之间的道路会变得不连通,直到拥堵解决,道路才会恢复畅通。初来咋到的你决心毛遂自荐到交通部某份差事,部长听说你来自一个科技高度发达的世界,喜出望外地要求你编写一个查询应答系统,以挽救已经病入膏肓的小人国交通系统。 小人国的交通部将提供一些交通信息给你,你的任务是根据当前的交通情况回答查询的问题。交通信息可以分为以下几种格式: Close r1 c1 r2 c2:相邻的两座城市(r1,c1)和(r2,c2)之间的道路被堵塞了; Open r1 c1 r2 c2:相邻的两座城市(r1,c1)和(r2,c2)之间的道路被疏通了; Ask r1 c1 r2 c2:询问城市(r1,c1)和(r2,c2)是否连通。如果存在一条路径使得这两条城市连通,则返回Y,否则返回N;
    Input

    第一行只有一个整数C,表示网格的列数。接下来若干行,每行为一条交通信息,以单独的一行“Exit”作为结束。我们假设在一开始所有的道路都是堵塞的。 对30%测试数据,我们保证C小于等于1000,信息条数小于等于1000; 对100%测试数据,我们保证 C小于等于100000,信息条数小于等于100000。
    Output

    对于每个查询,输出一个“Y”或“N”。
    Sample Input
    2
    Open 1 1 1 2
    Open 1 2 2 2
    Ask 1 1 2 2
    Ask 2 1 2 2
    Exit


    Sample Output
    Y
    N

    又见恶心题

    用线段树维护这一个区间四个角的连通性,这个满足区间可加性

    特殊情况:询问的两个点不一定是从中间联通,它可能从外面绕一个大弯子

    所以还要检查一下(1,c1)和(c2,C)的连通性

    今天上午终于准备写这道恶心题了,果然恶心

    无语了....最后这个错误真奇葩,虽然已经是第二次了

    因为这个字符串只有4种情况,很多人应该都是判三个然后最后一个放在最后那个else那里

    可是我在最后在最后那个else那里加了一句if s='A' then就神奇的从WA变成了AC(这是什么奇葩原因啊)

      1 type
      2     aa=array[1..8]of boolean;
      3     node=record
      4       lson,rson,left,right:longint;
      5       flag:aa;
      6     end;
      7 const
      8     maxn=200010;
      9 var
     10     tree:array[0..maxn*2]of node;
     11     n,tot,x1,y1,x2,y2,ll,rr:longint;
     12     ans,save,k1,k2:aa;
     13     s:char;
     14  
     15 procedure swap(var x,y:longint);
     16 var
     17     t:longint;
     18 begin
     19     t:=x;x:=y;y:=t;
     20 end;
     21  
     22 procedure build(l,r:longint);
     23 var
     24     mid,now:longint;
     25 begin
     26     inc(tot);
     27     now:=tot;
     28     with tree[now] do
     29       begin
     30         left:=l;
     31         right:=r;
     32         if l=r then
     33         begin
     34           flag[1]:=true;
     35           flag[3]:=true;
     36           exit;
     37         end;
     38       end;
     39     mid:=(l+r)>>1;
     40     with tree[now] do
     41       begin
     42         lson:=tot+1;
     43         build(l,mid);
     44         rson:=tot+1;
     45         build(mid+1,r);
     46       end;
     47 end;
     48  
     49 procedure update(var a,b,c:aa);
     50 begin
     51     fillchar(save,sizeof(save),false);
     52     save[7]:=c[7];
     53     save[8]:=c[8];
     54     if (b[1] and b[7] and c[1])or(b[5] and b[8] and c[6]) then save[1]:=true;
     55     if b[2] or (b[1] and b[7] and c[2] and b[8] and b[3]) then save[2]:=true;
     56     if (b[3] and b[8] and c[3])or(b[6] and b[7] and c[5]) then save[3]:=true;
     57     if c[4] or (c[1] and b[7] and b[4] and b[8] and c[3]) then save[4]:=true;
     58     if (b[1] and b[7] and c[5])or(b[5] and b[8] and c[3]) then save[5]:=true;
     59     if (b[3] and b[8] and c[6])or(b[6] and b[7] and c[1]) then save[6]:=true;
     60     a:=save;
     61 end;
     62  
     63 procedure change(now:longint);
     64 var
     65     mid:longint;
     66 begin
     67     with tree[now] do
     68       begin
     69         if left=right then
     70         begin
     71           if y1=y2 then
     72           begin
     73             flag[2]:=s='n';
     74             flag[4]:=s='n';
     75             flag[5]:=s='n';
     76             flag[6]:=s='n';
     77           end
     78           else flag[x1+6]:=s='n';
     79           exit;
     80         end;
     81         mid:=(left+right)>>1;
     82         if y1<=mid then change(lson)
     83         else change(rson);
     84         update(flag,tree[lson].flag,tree[rson].flag);
     85       end;
     86 end;
     87  
     88 procedure dfs(now:longint);
     89 var
     90     mid:longint;
     91 begin
     92     with tree[now] do
     93       begin
     94         if (left=ll)and(right<=rr) then
     95         begin
     96           ans:=flag;
     97           exit;
     98         end;
     99         if (left>=ll)and(right<=rr) then
    100         begin
    101           update(ans,ans,flag);
    102           exit;
    103         end;
    104         mid:=(left+right)>>1;
    105         if ll<=mid then dfs(lson);
    106         if rr>mid then dfs(rson);
    107       end;
    108 end;
    109  
    110 procedure work;
    111 var
    112     i:longint;
    113 begin
    114     read(s);
    115     if s='E' then halt;
    116     if s='O' then
    117     begin
    118       for i:=1 to 3 do
    119         read(s);
    120       readln(x1,y1,x2,y2);
    121       if y1>y2 then
    122       begin
    123         swap(x1,x2);
    124         swap(y1,y2);
    125       end;
    126       change(1);
    127     end
    128       else
    129         if s='C' then
    130         begin
    131           for i:=1 to 4 do
    132             read(s);
    133           readln(x1,y1,x2,y2);
    134           if y1>y2 then
    135           begin
    136             swap(x1,x2);
    137             swap(y1,y2);
    138           end;
    139           change(1);
    140         end
    141         else
    142           if s='A' then
    143           begin
    144             for i:=1 to 2 do
    145               read(s);
    146             readln(x1,y1,x2,y2);
    147             if y1>y2 then
    148             begin
    149               swap(x1,x2);
    150               swap(y1,y2);
    151             end;
    152             ll:=1;
    153             rr:=y1;
    154             dfs(1);
    155             k1:=ans;
    156             ll:=y2;
    157             rr:=n;
    158             dfs(1);
    159             k2:=ans;
    160             ll:=y1;
    161             rr:=y2;
    162             dfs(1);
    163             if k1[4] then
    164             begin
    165               fillchar(k1,sizeof(k1),true);
    166               update(ans,k1,ans);
    167             end;
    168             if k2[2] then
    169             begin
    170               fillchar(k2,sizeof(k2),true);
    171               ans[7]:=true;
    172               ans[8]:=true;
    173               update(ans,ans,k2);
    174             end;
    175             if x1=1 then
    176               if x2=1 then
    177               begin
    178                 if ans[1] then writeln('Y')
    179                 else writeln('N');
    180               end
    181               else
    182                 begin
    183                   if ans[5] then writeln('Y')
    184                   else writeln('N');
    185                 end
    186             else
    187               if x2=1 then
    188               begin
    189                 if ans[6] then writeln('Y')
    190                 else writeln('N');
    191               end
    192               else
    193                 begin
    194                   if ans[3] then writeln('Y')
    195                   else writeln('N');
    196                 end;
    197           end;
    198 end;
    199  
    200 begin
    201     readln(n);
    202     build(1,n);
    203     while true do
    204       work;
    205 end.
    View Code
  • 相关阅读:
    LeetCode 23. Merge k Sorted Lists
    第四章 基本TCP套接字编程 第五章 TCP客户/服务器程序实例
    LeetCode 18. 4Sum
    LeetCode 16. 3Sum Closest
    Leetcode题 257. Binary Tree Paths
    Django---Form表单
    Python---面向对象(二)
    Python---面向对象(一)
    Django---Cookie && Session && 分页
    [ Day51 ]Python之路----JavaScript --DOM操作
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3615886.html
Copyright © 2011-2022 走看看