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

二次联通门 : BZOJ 1018: [SHOI2008]堵塞的交通traffic

 

 

 

 

/*

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

    麻麻
    这题玩我

    这题简直消磨人的意志
    写了一天了
    写一段
    玩一段

    直接写不下去
    什么时候恢复一下心情再写

*/
#include <cstdio>
#include <iostream>

#define rg register
inline void read (int &n)
{
    rg char c = getchar ();
    for (n = 0; !isdigit (c); c = getchar ());
    for (; isdigit (c); n = n * 10 + c - '0', c = getchar ());
}

#define Max 200005

struct D 
{
    int a, b, c, d, e, f;
    D () { a = b = c = d = e = f = 0; }

};

inline D operator + (const D &L, const D &R)
{
    D n;
    n.d = L.d, n.b = R.b;
    n.a = (L.a & R.a) | (L.e & R.f);
    n.c = (L.c & R.c) | (L.f & R.e);
    n.f = (L.c & R.f) | (L.f & R.a);
    n.e = (L.e & R.c) | (L.a & R.e);
    return n;
}


namespace seg
{
    int L[Max << 2], R[Max << 2]; D key[Max << 2];

    void Build (int n, int l, int r)
    {
        L[n] = l, R[n] = r;
        if (l == r) return ;
        int m = l + r >> 1;
        Build (n << 1, l, m), Build (n << 1 | 1, m + 1, r);
    }
    
    inline void Upsig (int n)
    {
        D &n = key[n];
        n.e = (n.a & n.b) | (n.c & n.d);
        n.f = (n.d & n.d) | (n.c & n.b);
        return ;
    }

    void Modi (int n, int p, int t)
    {
        if (L[n] == R[n]) 
        {
            if (t == 1) key[n].a = 1;
            else if (t == 2) key[n].b = 1;
            else if (t == 3) key[n].c = 1;
            else if (t == 4) key[n].d = 1;

            if (t == -1) key[n].a = 0;
            else if (t == -2) key[n].b = 0;
            else if (t == -3) key[n].c = 0;
            else if (t == -4) key[n].d = 0;

            Upsig (n);    
            return ;
        }
        int m = L[n] + R[n] >> 1;
        if (p <= m) Modi (n << 1, p, t), if (p > m) Modi (n << 1 | 1, p, t);
        key[n] = key[n << 1] + key[n << 1 | 1];
    }


    D Query (int n, int l, int r)
    {
        if (l <= L[n] && R[n] <= r) return key[n];    
        int m = L[n] + R[n] >> 1; D res;
        if (l <= m) res = Query (n << 1, l, r);
        if (r > m) res = res + Query (n << 1 | 1, l, r);
        return res;    
    }    
}

int main (int argc, char *argv[])
{
    int N, M; read (N); rg int i, j;
    int x1, y1, x2, y2; D res; int t;
    for (char type[10]; ; )
    {
        scanf ("%s", type);
        if (type[0] == 'E') break;
        if (type[0] == 'O')
        {
            read (x1), read (y1), read (x2), read (y2);
            if (x1 > x2) std :: swap (x1, x2), std :: swap (y1, y2);
            if (x1 == x2)
            {
                if (x1 != 1) seg :: Modi (1, x1 - 1, 2), seg :: Modi (1, x1, 4);
                else seg :: Modi (1, 1, 4);
            }
            else
            {
                if (y1 == 1) seg :: Modi (1, x1, 1);
                else seg :: Modi (1, x1, 3);
            }
        }

#define Yes { puts ("Y"); continue; }
#define No { puts ("N"); continue; }

        else if (type[0] == 'Q') // t == 1 
        {
            res = seg :: Query (1, x1, y1 - 1);    
            if (x1 == x2 && y1 == y2) Yes
            if (x1 == x2)
            {
                if (res.a) Yes
            }        
            if (y1 == y2)
            {

                
            }
        }
        else
        {


        }
    }

    return 0;
}

 

posted @ 2017-12-27 20:56  ZlycerQan  阅读(...)  评论(... 编辑 收藏