POJ poj 2155 Matrix
题目链接【http://poj.org/problem?id=2155】
/* poj 2155 Matrix 题意:矩阵加减,单点求和 二维线段树,矩阵加减,单点求和。 */ using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1010; int N, Q; struct Nodey { int l, r; int val; }; int locx[MAXN], locy[MAXN]; struct Nodex { int l, r; Nodey sty[MAXN * 3]; void build(int i, int _l, int _r) { sty[i].l = _l; sty[i].r = _r; sty[i].val = 0; if(_l == _r) { locy[_l] = i; return; } int mid = (_l + _r) >> 1; build(i << 1, _l, mid); build((i << 1) | 1, mid + 1, _r); } void add(int i, int _l, int _r, int val) { if(sty[i].l == _l && sty[i].r == _r) { sty[i].val += val; return; } int mid = (sty[i].l + sty[i].r) >> 1; if(_r <= mid) add(i << 1, _l, _r, val); else if(_l > mid) add((i << 1) | 1, _l, _r, val); else { add(i << 1, _l, mid, val); add((i << 1) | 1, mid + 1, _r, val); } } } stx[MAXN * 3]; void build(int i, int l, int r) { stx[i].l = l; stx[i].r = r; stx[i].build(1, 1, N); if(l == r) { locx[l] = i; return; } int mid = (l + r) >> 1; build(i << 1, l, mid); build((i << 1) | 1, mid + 1, r); } void add(int i, int x1, int x2, int y1, int y2, int val) { if(stx[i].l == x1 && stx[i].r == x2) { stx[i].add(1, y1, y2, val); return; } int mid = (stx[i].l + stx[i].r) / 2; if(x2 <= mid) add(i << 1, x1, x2, y1, y2, val); else if(x1 > mid) add((i << 1) | 1, x1, x2, y1, y2, val); else { add(i << 1, x1, mid, y1, y2, val); add((i << 1) | 1, mid + 1, x2, y1, y2, val); } } int sum(int x, int y) { int ret = 0; for(int i = locx[x]; i; i >>= 1) for(int j = locy[y]; j; j >>= 1) ret += stx[i].sty[j].val; return ret; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d%d", &N, &Q); build(1, 1, N); char op[10]; int x1, x2, y1, y2; while(Q--) { scanf("%s", op); if(op[0] == 'C') { scanf("%d%d%d%d", &x1, &y1, &x2, &y2); //(x1,y1)左上角,右下角 add(1, x1, x2, y1, y2, 1); } else { scanf("%d%d", &x1, &y1); if(sum(x1, y1) % 2 == 0) printf("0\n"); else printf("1\n"); } } if(T) printf("\n"); } return 0; }
想的太多,做的太少。