zoukankan      html  css  js  c++  java
  • [BZOJ1018][SHOI2008]堵塞的交通traffic(线段树)

    显然离线可以分治并查集,在线可以LCT,单都没用到只有两行的性质。

    线段树,每个点记录一个矩形的四个角的连通情况,合并时讨论各种情况即可。

    参考:https://www.cnblogs.com/MashiroSky/p/5973686.html

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define ls (x<<1)
     4 #define rs (ls|1)
     5 #define lson ls,L,mid
     6 #define rson rs,mid+1,R
     7 #define rep(i,l,r) for (int i=(l); i<=(r); i++);
     8 using namespace std;
     9 
    10 const int N=100010;
    11 char s[10];
    12 int n,r1,r2,c1,c2;
    13 struct P{ bool U,D,l,r,u,d,q,p; }p[N<<2];
    14 
    15 void merge(P &x,P L,P R){
    16     x.u=(L.u & x.U & R.u) | (L.q & x.D & R.p);
    17     x.d=(L.d & x.D & R.d) | (L.p & x.U & R.q);
    18     x.q=(L.u & x.U & R.q) | (L.q & x.D & R.d);
    19     x.p=(L.p & x.U & R.u) | (L.d & x.D & R.p);
    20     x.l=L.l | (L.u & x.U & R.l & x.D & L.d);
    21     x.r=R.r | (R.u & x.U & L.r & x.D & R.d);
    22 }
    23 
    24 void build(int x,int L,int R){
    25     if (L==R){ p[x]=(P){1,1,0,0,1,1,0,0}; return; }
    26     int mid=(L+R)>>1;
    27     build(lson); build(rson);
    28 }
    29 
    30 void mdfr(int x,int L,int R,int pos,int k,bool op){
    31     int mid=(L+R)>>1;
    32     if (mid==pos){
    33         if (k==1) p[x].U=op; else p[x].D=op;
    34         merge(p[x],p[ls],p[rs]); return;
    35     }
    36     if (pos<=mid) mdfr(lson,pos,k,op); else mdfr(rson,pos,k,op);
    37     merge(p[x],p[ls],p[rs]);
    38 }
    39 
    40 void mdfc(int x,int L,int R,int pos,bool op){
    41     if (L==R){ p[x].l=p[x].r=p[x].p=p[x].q=op; return; }
    42     int mid=(L+R)>>1;
    43     if (pos<=mid) mdfc(lson,pos,op); else mdfc(rson,pos,op);
    44     merge(p[x],p[ls],p[rs]);
    45 }
    46 
    47 P que(int x,int L,int R,int l,int r){
    48     if (L==l && r==R) return p[x];
    49     int mid=(L+R)>>1;
    50     if (r<=mid) return que(lson,l,r);
    51     else if (l>mid) return que(rson,l,r);
    52         else{ P res=p[x]; merge(res,que(lson,l,mid),que(rson,mid+1,r)); return res; }
    53 }
    54 
    55 int main(){
    56     freopen("bzoj1018.in","r",stdin);
    57     freopen("bzoj1018.out","w",stdout);
    58     scanf("%d",&n); build(1,1,n);
    59     while (1){
    60         scanf("%s",s);
    61         if (s[0]=='E') break;
    62         scanf("%d%d%d%d",&r1,&c1,&r2,&c2);
    63         if (c1>c2) swap(r1,r2),swap(c1,c2);
    64         if (s[0]=='O'){
    65             if (r1==r2) mdfr(1,1,n,c1,r1,1); else mdfc(1,1,n,c1,1);
    66         }
    67         if (s[0]=='C'){
    68             if (r1==r2) mdfr(1,1,n,c1,r1,0); else mdfc(1,1,n,c1,0);
    69         }
    70         if (s[0]=='A'){
    71             P L=que(1,1,n,1,c1),M=que(1,1,n,c1,c2),R=que(1,1,n,c2,n);
    72             if (r1==1 && r2==1) puts((M.u | (L.r & M.p) | (M.q & R.l) | (L.r & M.d & R.l))?"Y":"N");
    73             if (r1==2 && r2==2) puts((M.d | (L.r & M.q) | (M.p & R.l) | (L.r & M.u & R.l))?"Y":"N");
    74             if (r1==1 && r2==2) puts((M.q | (L.r & M.d) | (M.u & R.l) | (L.r & M.p & R.l))?"Y":"N");
    75             if (r1==2 && r2==1) puts((M.p | (L.r & M.u) | (M.d & R.l) | (L.r & M.q & R.l))?"Y":"N");
    76         }
    77     }
    78     return 0;
    79 }
  • 相关阅读:
    sqlzoo练习答案--SUM and COUNT
    响应式的嵌入内容和图片
    缓存server设计与实现(五)
    编译器DIY——读文件
    [Leetcode]-Pascal&#39;s Triangle
    zoj 1562 反素数 附上个人对反素数性质的证明
    [POJ 1236][IOI 1996]Network of Schools
    POJ 3691 DNA repair [AC自动机 DP]
    POJ 1625 Censored! [AC自动机 高精度]
    51Nod 1225 余数之和 [整除分块]
  • 原文地址:https://www.cnblogs.com/HocRiser/p/9926025.html
Copyright © 2011-2022 走看看