1018: [SHOI2008]堵塞的交通traffic - BZOJ

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

 

posted @ 2014-03-21 14:58  Randolph87  阅读(333)  评论(0编辑  收藏  举报