poj 2155 matrix 二维线段树
2015-12-07 18:20
537 查看
题目链接
区间翻转, 单点查询, 查询操作我真是不太明白......
区间翻转, 单点查询, 查询操作我真是不太明白......
#include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <map> #include <set> #include <string> #include <queue> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, a, n) for(int i = a; i<n; i++) #define ull unsigned long long typedef pair<int, int> pll; const double PI = acos(-1.0); const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int dir[][2] = { {-1, 0}, {1, 0}, {0, -1}, {0, 1} }; const int maxn = 1005; int sum[maxn<<2][maxn<<2], n, ans; void pushUp(int pos, int rt) { sum[pos][rt] = sum[pos][rt<<1]+sum[pos][rt<<1|1]; } void sub_update(int pos, int L, int R, int l, int r, int rt) { if(L<=l&&R>=r) { sum[pos][rt]^=1; return ; } int m = l+r>>1; if(L<=m) sub_update(pos, L, R, lson); if(R>m) sub_update(pos, L, R, rson); } void update(int LX, int RX, int LY, int RY, int l, int r, int rt) { if(LX<=l&&RX>=r) { sub_update(rt, LY, RY, 1, n, 1); return ; } int m = l+r>>1; if(LX<=m) update(LX, RX, LY, RY, lson); if(RX>m) update(LX, RX, LY, RY, rson); } void sub_query(int pos, int p, int l, int r, int rt) { ans ^= sum[pos][rt]; if(l == r) return ; int m = l+r>>1; if(p<=m) return sub_query(pos, p, lson); else return sub_query(pos, p, rson); } void query(int x, int y, int l, int r, int rt) { sub_query(rt, y, 1, n, 1); if(l == r) return ; int m = l+r>>1; if(x<=m) return query(x, y, lson); else return query(x, y, rson); } int main() { int t, q, lx, rx, ly, ry; cin>>t; char c[2]; while(t--) { mem(sum); scanf("%d%d", &n, &q); while(q--) { scanf("%s", c); if(c[0] == 'C') { scanf("%d%d%d%d", &lx, &ly, &rx, &ry); update(lx, rx, ly, ry, 1, n, 1); } else { scanf("%d%d", &lx, &ly); ans = 0; query(lx, ly, 1, n, 1); printf("%d\n", ans); } } if(t) puts(""); } }
相关文章推荐
- 使用std::move()提醒编译器对返回值进行优化
- 常用语
- Linux目录树架构、挂载、常用根目录介绍
- android 自定义view的使用(最佳demo——返回标题栏)
- hashmap的key值不能重复
- 定时器 获取当前时间
- Find Minimum in Rotated Sorted Array
- 1.惨不忍睹凌乱的定时任务
- 谈谈Java的集合组件
- STL UVA 11995 I Can Guess the Data Structure!
- PInvoke复习之C# C++ 字符串传递
- MapReduce:详解Shuffle过程
- SQL 2008,忘记SA密码,又删除了sysadmin中删除了builtin\Administrators帐号
- 在Unix系统中安装Maven并配置Maven自动发布java web到tomcat
- 27个提升效率的iOS开源库推荐
- xcode7中搭建python开发环境
- mongodb 简单使用说明
- 生产者—消费者模型及实现
- build.xml的编写
- POJ 1273 Drainage Ditches