poj 2155 Matrix 【二维线段树】

来源:互联网 发布:ms sql 日期函数 编辑:程序博客网 时间:2024/05/10 06:09

题目链接:poj 2155 Matrix

题意:有一个nn矩阵,初始元素均为0。有q次操作
1、Cx1y1x2y2(x1,y1)为左顶点,以(x2,y2)为右顶点的矩阵元素异或1
2、Qx1y1,查询矩阵(x1,y1)元素。

思路:每次查询的是叶子,我们可以记录前面所有层被异或的次数。从叶子走到顶点,最后看被异或次数的奇偶性。
AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#include <stack>#define PI acos(-1.0)#define CLR(a, b) memset(a, (b), sizeof(a))#define fi first#define se second#define ll o<<1#define rr o<<1|1using namespace std;typedef long long LL;typedef pair<int, int> pii;const int MAXN = 1100 + 10;const int pN = 1e6;// <= 10^7const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;void add(LL &x, LL y) { x += y; x %= MOD; }struct Nodey {    int ly, ry, cnt;};int posx[MAXN], posy[MAXN], n;struct Nodex {    int lx, rx;    Nodey treey[MAXN<<2];    void Build_y(int o, int l, int r) {        treey[o].ly = l;        treey[o].ry = r;        treey[o].cnt = 0;        if(l == r) {            posy[l] = o;            return ;        }        int mid = (l + r) >> 1;        Build_y(ll, l, mid);        Build_y(rr, mid+1, r);    }    void add_y(int o, int L, int R, int v)    {        if(treey[o].ly == L && treey[o].ry == R) {            treey[o].cnt += v;            return ;        }        int mid = (treey[o].ly + treey[o].ry) >> 1;        if(R <= mid) add_y(ll, L, R, v);        else if(L > mid) add_y(rr, L, R, v);        else { add_y(ll, L, mid, v); add_y(rr, mid+1, R, v); }    }};Nodex treex[MAXN<<2];void Build_x(int o, int l, int r){    treex[o].lx = l;    treex[o].rx = r;    treex[o].Build_y(1, 1, n);    if(l == r) {        posx[l] = o;        return ;    }    int mid = (l + r) >> 1;    Build_x(ll, l, mid);    Build_x(rr, mid+1, r);}void add_x(int o, int x1, int x2, int y1, int y2, int v){    if(treex[o].lx == x1 && treex[o].rx == x2) {        treex[o].add_y(1, y1, y2, v);        return ;    }    int mid = (treex[o].lx + treex[o].rx) >> 1;    if(x2 <= mid) add_x(ll, x1, x2, y1, y2, v);    else if(x1 > mid) add_x(rr, x1, x2, y1, y2, v);    else { add_x(ll, x1, mid, y1, y2, v); add_x(rr, mid+1, x2, y1, y2, v); }}int Sum(int x, int y) {    int sx = posx[x];    int sy = posy[y];    int sum = 0;    for(int i = sx; i; i >>= 1) {        for(int j = sy; j; j >>= 1) {            sum += treex[i].treey[j].cnt;        }    }    return sum & 1;}int main(){    int t; scanf("%d", &t);    while(t--)    {        int q; scanf("%d%d", &n, &q);        Build_x(1, 1, n);        while(q--) {            char op[5]; int x1, y1, x2, y2;            scanf("%s", op);            if(op[0] == 'C') {                scanf("%d%d%d%d", &x1, &y1, &x2, &y2);                add_x(1, x1, x2, y1, y2, 1);            }            else {                scanf("%d%d", &x1, &y1);                printf("%d\n", Sum(x1, y1));            }        }        if(t) printf("\n");    }    return 0;}
0 0
原创粉丝点击