zoukankan      html  css  js  c++  java
  • [BZOJ1018][SHOI2008]堵塞的交通traffic 线段树维护连通性

    1018: [SHOI2008]堵塞的交通traffic

    Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3795  Solved: 1253 [Submit][Status][Discuss]

    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”作为 结束。我们假设在一开始所有的道路都是堵塞的。我们保证 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
     
     
    丧心病狂。
    此题用线段树维护联通性。
    每个线段树维护第l列至第r列的矩形的四个点相互的连通性。
    处理枚举就行
     
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<algorithm>
     7 #define MAXN 100005
     8 using namespace std;
     9 int c;
    10 struct data {
    11     int l1l2,l1r1,l1r2,l2r1,l2r2,r1r2;
    12     int b[3];
    13 }t[MAXN*4];
    14 
    15 data pushup(data lc,data rc) {
    16     data ans;
    17     ans.b[1]=rc.b[1];ans.b[2]=rc.b[2];
    18     ans.l1l2=ans.l1r1=ans.l1r2=ans.l2r1=ans.l2r2=ans.r1r2=0;
    19     if(lc.l1l2||(lc.l1r1&&lc.b[1]&&rc.l1l2&&lc.b[2]&&lc.l2r2)) ans.l1l2=1;
    20     if(rc.r1r2||(rc.l1r1&&lc.b[1]&&lc.r1r2&&lc.b[2]&&rc.l2r2)) ans.r1r2=1;
    21     if((lc.l1r1&&lc.b[1]&&rc.l1r1)||(lc.l1r2&&lc.b[2]&&rc.l2r1)) ans.l1r1=1;
    22     if((lc.l1r1&&lc.b[1]&&rc.l1r2)||(lc.l1r2&&lc.b[2]&&rc.l2r2)) ans.l1r2=1;
    23     if((lc.l2r1&&lc.b[1]&&rc.l1r1)||(lc.l2r2&&lc.b[2]&&rc.l2r1)) ans.l2r1=1;
    24     if((lc.l2r1&&lc.b[1]&&rc.l1r2)||(lc.l2r2&&lc.b[2]&&rc.l2r2)) ans.l2r2=1;
    25     return ans;
    26 }
    27 
    28 void build(int l,int r,int o) {
    29     if(l==r){t[o].l1r1=t[o].l2r2=1;return;}
    30     int mid=(l+r)>>1,lc=o<<1,rc=lc+1;
    31     build(l,mid,lc);build(mid+1,r,rc);
    32     t[o]=pushup(t[lc],t[rc]);
    33 }
    34 int l1,r1,l2,r2;
    35 void update_1(int l,int r,int o,int x,int kind) {
    36     if(l==r){t[o].b[l1]=kind;return;}
    37     int mid=(l+r)>>1,lc=o<<1,rc=lc+1;
    38     if(x<=mid) update_1(l,mid,lc,x,kind);
    39     else update_1(mid+1,r,rc,x,kind);
    40     t[o]=pushup(t[lc],t[rc]);
    41 }
    42 
    43 void update_2(int l,int r,int o,int x,int kind) {
    44     if(l==r){t[o].l1l2=t[o].l2r1=t[o].l1r2=t[o].r1r2=kind;return;}
    45     int mid=(l+r)>>1,lc=o<<1,rc=lc+1;
    46     if(x<=mid) update_2(l,mid,lc,x,kind);
    47     else update_2(mid+1,r,rc,x,kind);
    48     t[o]=pushup(t[lc],t[rc]);
    49 }
    50 data query(int l,int r,int o,int L,int R) {
    51     if(L<=l&&R>=r){return t[o];}
    52     int mid=(l+r)>>1,lc=o<<1,rc=lc+1;
    53     if(L>mid) {return query(mid+1,r,rc,L,R);}
    54     else if(R<=mid){return query(l,mid,lc,L,R);}
    55     else return pushup(query(l,mid,lc,L,R),query(mid+1,r,rc,L,R));
    56 }
    57 bool check() {
    58     data l=query(1,c,1,1,r1);
    59     data r=query(1,c,1,r2,c);
    60     data now=query(1,c,1,r1,r2);
    61     if(l1==l2) {
    62         if((l1==1)&&(now.l1r1||(now.l1r2&&r.l1l2)||(now.l2r1&&l.r1r2)||(now.l2r2&&l.r1r2&&r.l1l2))) return 1;
    63         if((l1==2)&&(now.l2r2||(now.l2r1&&r.l1l2)||(now.l1r2&&l.r1r2)||(now.l1r1&&l.r1r2&&r.l1l2))) return 1;
    64     }
    65     else {
    66         if((l1==1)&&(now.l1r2||(now.l1r1&&r.l1l2)||(now.l2r2&&l.r1r2)||(now.l2r1&&l.r1r2&&r.l1l2))) return 1;
    67         if((l1==2)&&(now.l2r1||(now.l2r2&&r.l1l2)||(now.l1r1&&l.r1r2)||(now.l1r2&&l.r1r2&&r.l1l2))) return 1;
    68     }
    69     return 0;
    70 }
    71 int main() {
    72     //freopen("data.in","r",stdin);
    73     //freopen("2.out","w",stdout);
    74     scanf("%d",&c);
    75     build(1,c,1);
    76     while(1) {
    77         char ch[5];
    78         scanf("%s",ch);
    79         if(ch[0]=='O') {
    80             scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
    81             if(r1>r2){swap(l1,l2);swap(r1,r2);}
    82             if(r1!=r2) update_1(1,c,1,r1,1);
    83             else update_2(1,c,1,r1,1);
    84         }
    85         else if(ch[0]=='C') {
    86             scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
    87             if(r1>r2){swap(l1,l2);swap(r1,r2);}
    88             if(r1!=r2) update_1(1,c,1,r1,0);
    89             else update_2(1,c,1,r1,0);
    90         }
    91         else if(ch[0]=='A') {
    92             scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
    93             if(r1>r2){swap(l1,l2);swap(r1,r2);}
    94             if(check()) printf("Y
    ");
    95             else printf("N
    ");
    96         }
    97         else return 0;
    98     }
    99 }
    View Code
     
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    深入Android 【一】 —— 序及开篇
    Android中ContentProvider和ContentResolver使用入门
    深入Android 【六】 —— 界面构造
    The service cannot be activated because it does not support ASP.NET compatibility. ASP.NET compatibility is enabled for this application. Turn off ASP.NET compatibility mode in the web.config or add the AspNetCompatibilityRequirements attribute to the ser
    Dynamic Business代码片段总结
    对文件的BuildAction以content,resource两种方式的读取
    paraview 3.12.0 windows下编译成功 小记
    百度网盘PanDownload使用Aria2满速下载
    netdata的安装与使用
    用PS给证件照排版教程
  • 原文地址:https://www.cnblogs.com/wls001/p/7652593.html
Copyright © 2011-2022 走看看