poj 2155 Matrix 【二维线段树】
来源:互联网 发布:ms sql 日期函数 编辑:程序博客网 时间:2024/05/10 06:09
题目链接:poj 2155 Matrix
题意:有一个
1、
2、
思路:每次查询的是叶子,我们可以记录前面所有层被异或的次数。从叶子走到顶点,最后看被异或次数的奇偶性。
#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
- 二维线段树 POJ 2155 Matrix
- POJ 2155 Matrix 二维线段树
- POJ 2155 Matrix【二维线段树】
- POJ 2155 Matrix (二维线段树)
- POJ 2155 Matrix 二维线段树
- POJ 2155 Matrix (二维线段树)
- poj 2155 Matrix 【二维线段树】
- POJ 2155 Matrix(二维线段树)
- 二维线段树(Matrix,poj 2155)
- POJ 2155 Matrix (二维线段树)
- POJ 2155 Matrix 二维线段树
- POJ 2155 Matrix (二维线段树)
- POJ-2155-Matrix(二维树状数组 & 二维线段树)
- [poj 2155] Matrix(二维zkw线段树)
- POJ 2155 Matrix 二维线段树 区间修改 单点查询
- POJ 2155 Matrix 二维线段树+标记永久化?
- POJ 2155 Matrix 【二维线段树模板题】
- poj 2155 Matrix(二维线段树,树套树)
- 程序员必须了解的内存知识
- Linux用到的一些指令
- 哈理工OJ 1289 对数问题
- 使LibSVM输出后验概率
- SVN服务器搭建和使用(一)
- poj 2155 Matrix 【二维线段树】
- 蓝桥杯 基本训练 数的读法
- struts 迭代器iterator四种使用方式 S标签
- oracle 修改用户名
- HDU 3555 Bomb (数位DP)
- C语言实现单链表——之基本操作1
- Centos修改语言为英文
- Dagger是什么和我们怎么通过使用它获得收获
- Vysor使用——用电脑操作手机 无需Root