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哈哈~
  • 相关阅读:
    mysql的常用查询创建命令
    maven的简介
    google guava
    分库分表的情况下生成全局唯一的ID
    书单
    MD5Util
    UUID生成工具
    nodejs学习笔记三——nodejs使用富文本插件ueditor
    nodejs学习笔记二——链接mongodb
    mongodb 安装
  • 原文地址:https://www.cnblogs.com/wls001/p/7652593.html
Copyright © 2011-2022 走看看