zoukankan      html  css  js  c++  java
  • 【BZOJ1018】堵塞的交通traffic(线段树,网格图,连通性)

    题意:一个2行C列的矩形网格图,网格上的每个点代表一个城市,相邻的城市之间有一条道路

    一开始每条道路都是堵塞的,堵塞即为不可经过。经过一些操作后,可能某些道路通畅了,也可能某些道路堵塞了

    多次询问,询问两个城市是否联通

    C,q<=1e5

    思路:From https://www.cnblogs.com/MashiroSky/p/5973686.html

      1 #include<cstdio>
      2 #include<cstring>
      3 #include<string>
      4 #include<cmath>
      5 #include<iostream>
      6 #include<algorithm>
      7 #include<map>
      8 #include<set>
      9 #include<queue>
     10 #include<vector>
     11 using namespace std;
     12 typedef long long ll;
     13 typedef unsigned int uint;
     14 typedef unsigned long long ull;
     15 typedef pair<int,int> PII;
     16 typedef vector<int> VI;
     17 #define fi first
     18 #define se second 
     19 #define MP make_pair
     20 #define N   110000
     21 #define M   41
     22 #define eps 1e-8
     23 #define pi acos(-1)
     24 
     25 struct node
     26 {
     27     int U,D,l,r,u,d,p,q;
     28 }t[N<<2];
     29 int n; 
     30 char s[10];
     31 
     32 int read()
     33 { 
     34    int v=0,f=1;
     35    char c=getchar();
     36    while(c<48||57<c) {if(c=='-') f=-1; c=getchar();}
     37    while(48<=c&&c<=57) v=(v<<3)+v+v+c-48,c=getchar();
     38    return v*f;
     39 }
     40 
     41 void pushup(node &p,node l,node r)
     42 {
     43     p.l=l.l|(l.u&p.U&r.l&p.D&l.d);
     44     p.r=r.r|(r.u&p.U&l.r&p.D&r.d);
     45     p.u=(l.u&p.U&r.u)|(l.q&p.D&r.p);
     46     p.d=(l.d&p.D&r.d)|(l.p&p.U&r.q);
     47     p.q=(l.u&p.U&r.q)|(l.q&p.D&r.d);
     48     p.p=(l.d&p.D&r.p)|(l.p&p.U&r.u);
     49 }
     50 
     51 void build(int l,int r,int p)
     52 {
     53     if(l==r)
     54     {
     55         t[p].U=t[p].D=t[p].u=t[p].d=1;
     56         return;
     57     }
     58     int mid=(l+r)>>1;
     59     build(l,mid,p<<1);
     60     build(mid+1,r,p<<1|1);
     61 }
     62 
     63 void updater(int l,int r,int x,int y,int v,int p)
     64 {
     65     int mid=(l+r)>>1;
     66     if(x==mid)
     67     {
     68         if(y==1) t[p].U=v;
     69          else t[p].D=v;
     70          pushup(t[p],t[p<<1],t[p<<1|1]);
     71          return;
     72     }
     73     if(x<=mid) updater(l,mid,x,y,v,p<<1);
     74      else updater(mid+1,r,x,y,v,p<<1|1);
     75     pushup(t[p],t[p<<1],t[p<<1|1]);
     76 }
     77 
     78 void updatec(int l,int r,int x,int v,int p)
     79 {
     80     int mid=(l+r)>>1;
     81     if(l==r)
     82     {
     83         t[p].l=t[p].r=t[p].p=t[p].q=v;
     84         return;
     85     }
     86     if(x<=mid) updatec(l,mid,x,v,p<<1);
     87      else updatec(mid+1,r,x,v,p<<1|1);
     88     pushup(t[p],t[p<<1],t[p<<1|1]);
     89 }
     90 
     91 node query(int l,int r,int x,int y,int p)
     92 {
     93     int mid=(l+r)>>1;
     94     if(x<=l&&r<=y) return t[p];
     95     if(y<=mid) return query(l,mid,x,y,p<<1);
     96      else if(x>mid) return query(mid+1,r,x,y,p<<1|1);
     97       else
     98       {
     99           node tmp=t[p];
    100         pushup(tmp,query(l,mid,x,y,p<<1),query(mid+1,r,x,y,p<<1|1));
    101         return tmp;
    102       }
    103 }
    104 
    105 int main()
    106 {
    107     freopen("bzoj1018.in","r",stdin);
    108     freopen("bzoj1018.out","w",stdout);
    109     scanf("%d",&n);
    110     build(1,n,1);
    111     int r1,r2,c1,c2; 
    112     while(scanf("%s",s)!=EOF)
    113     {
    114         if(s[0]=='E') break;
    115         scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
    116         if(c1>c2)
    117         {
    118             swap(c1,c2);
    119             swap(r1,r2);
    120         }
    121         if(s[0]=='O')
    122         {
    123             if(r1==r2) updater(1,n,c1,r1,1,1);
    124              else updatec(1,n,c1,1,1);
    125         }
    126         if(s[0]=='C')
    127         {
    128             if(r1==r2) updater(1,n,c1,r1,0,1);
    129              else updatec(1,n,c1,0,1);
    130         }
    131         if(s[0]=='A')
    132         {
    133             node l=query(1,n,1,c1,1),
    134                  x=query(1,n,c1,c2,1),
    135                  r=query(1,n,c2,n,1);
    136             int ans;
    137             
    138             if(r1==1&&r2==1)
    139                  ans=x.u|(l.r&x.p)|(x.q&r.l)|(l.r&x.d&r.l);
    140             
    141             if(r1==1&&r2==2)
    142                 ans=x.q|(l.r&x.d)|(x.u&r.l)|(l.r&x.p&r.l); 
    143                 
    144             if(r1==2&&r2==1)
    145                 ans=x.p|(l.r&x.u)|(x.d&r.l)|(l.r&x.q&r.l);
    146             
    147             if(r1==2&&r2==2)
    148                 ans=x.d|(l.r&x.q)|(x.p&r.l)|(l.r&x.u&r.l);
    149             if(ans) printf("Y
    ");
    150              else printf("N
    ");
    151         }        
    152     }      
    153     return 0;
    154 }
    155      
  • 相关阅读:
    multiprocessing模块
    socket&socketserver网络编程
    collections模块
    socket模块
    网络基础知识
    迭代器,生成器,列表推导式,生成器表达式
    logging模块
    Module
    页面中公用的全选按钮,单选按钮组件的编写
    ajax
  • 原文地址:https://www.cnblogs.com/myx12345/p/9757120.html
Copyright © 2011-2022 走看看