POJ2155 Matrix二维线段树经典题
二维树状数组
#include<iostream> #include<math.h> #include<algorithm> #include<stdlib.h> using namespace std; #define ll long long #define re(i,n) for(int i=0;i<n;i++) ; int c[maxn][maxn]; int n, q; int lowbit(int x){ return x&(-x); } void update(int x, int y){ ; i-=lowbit(i)) ; j -= lowbit(j)) c[i][j] ^= ; } int query(int x, int y){ ; for (int i = x; i <= n; i+=lowbit(i)) for (int j = y; j <= n; j += lowbit(j)){ ans ^= c[i][j]; } return ans; } int main(){ //freopen("in.txt", "r", stdin); int T; cin >> T; while (T--){ scanf("%d%d", &n, &q); memset(c, , sizeof(c)); while (q--){ ]; scanf("%s", op); ] == 'Q'){ int x, y; scanf("%d%d", &x, &y); printf("%d\n", query(x, y)); } else{ int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &fy, &tx, &ty); if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty); fx--, fy--; update(fx, fy); update(tx, ty); update(fx, ty); update(tx, fy); } } puts(""); } ; }
二维线段树
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; #define ll long long #define re(i,n) for(int i=0;i<n;i++) #define ls(x) x<<1,f,mid #define rs(x) x<<1|1,mid+1,t ; int n, q; int fx, fy, tx, ty, x, y; int ans; ][maxn << ]; void updatey(int i, int j, int f, int t){ if (fy <= f&&ty >= t){ a[i][j] ^= ; return; } ; if (fy <= mid)updatey(i,ls(j)); if (ty > mid)updatey(i, rs(j)); } void updatex(int i, int f, int t){ if (fx<=f&&tx>=t){ updatey(i, , , n); return; } ; if (fx <= mid)updatex(ls(i)); if (tx > mid)updatex(rs(i)); } void queryy(int i, int j, int f, int t){ ans += a[i][j]; if (f == t)return; ; if (y > mid)queryy(i,rs(j)); else queryy(i, ls(j)); } void queryx(int i, int f, int t){ queryy(i, , , n); if (f == t)return; ; if (x > mid)queryx(rs(i)); else queryx(ls(i)); } int main(){ //freopen("in.txt", "r", stdin); int T; cin >> T; while (T--){ scanf("%d%d", &n, &q); memset(a, , sizeof(a)); /*应该用memset,用for循环一定要注意初始化的不是n,而是全部. 公元2015年9.20日在于此坑. re(i, n + 1)re(j, n + 1)a[i][j] = 0; */ while (q--){ ]; scanf("%s", op); ] == 'Q'){ scanf("%d%d",&x,&y); ans = ; queryx(, , n); printf(); } else{ scanf("%d%d%d%d", &fx, &fy, &tx, &ty); if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty); updatex(,,n); //debug(); } } if (T)puts(""); } ; }
zkw二维线段树 开区间写法
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; ; typedef long long ll; #define re(i,n) for(int i=0;i<n;i++) ][maxn << ]; int n, q,sz; bool yquery(int x, int y){ y += sz; ; /* 因为1是哨兵节点,1必然始终都为0,不曾变化,所以算上1也无妨 */ while (y){ ans ^= tr[x][y]; y >>= ; } return ans; } bool query(int x,int y){ x += sz; ; while (x){ ans ^= yquery(x, y); x >>= ; } return ans; } void yupdate(int x, int fy, int ty){ fy += sz - , ty += sz + ; ){ )tr[x][fy ^ ] ^= ; )tr[x][ty ^ ] ^= ; fy >>= , ty >>= ; } } void update(int fx,int fy,int tx,int ty){ fx += sz - , tx += sz + ; ){ )yupdate(fx^, fy, ty); )yupdate(tx ^ , fy, ty); fx >>= , tx >>= ; } } int main(){ //freopen("in.txt", "r", stdin); int T; cin >> T; while (T--){ scanf("%d%d", &n, &q); sz = ; )sz <<= ; memset(tr, , sizeof(tr)); while (q--){ ]; scanf("%s", op); ] == 'Q'){ int x, y; scanf("%d%d", &x, &y); bool ans = query(x, y); printf("%d\n", ans); } else{ int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &fy, &tx, &ty); if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty); update(fx, fy, tx, ty); } } puts(""); } ; }
zwk二维线段树闭区间写法
#include<iostream> #include<stdio.h> #include<algorithm> using namespace std; ; typedef long long ll; #define re(i,n) for(int i=0;i<n;i++) ][maxn << ]; int n, q,sz; bool yquery(int x, int y){ y += sz-; ; /* 因为1是哨兵节点,1必然始终都为0,不曾变化,所以算上1也无妨 */ while (y){ ans ^= tr[x][y]; y >>= ; } return ans; } bool query(int x,int y){ x += sz-; ; while (x){ ans ^= yquery(x, y); x >>= ; } return ans; } /* 开区间=闭区间-两个端点. 所以,先处理两个端点之后就变成了开区间. 两个端点处理时要加上一个判断,l==r,如果相等,那就不能对同一个点处理两次,只处理一个点然后返回就行了;如果不等,那就先处理两端,再按照开区间的方式进行处理. */ void yupdate(int x, int fy, int ty){ fy += sz - , ty += sz -; ; return; } tr[x][fy] ^= , tr[x][ty] ^= ; ){ )tr[x][fy ^ ] ^= ; )tr[x][ty ^ ] ^= ; fy >>= , ty >>= ; } } void update(int fx,int fy,int tx,int ty){ fx += sz - , tx += sz - ; if (fx == tx){ yupdate(fx, fy, ty); return; } yupdate(fx, fy, ty), yupdate(tx, fy, ty); ){ )yupdate(fx^, fy, ty); )yupdate(tx ^ , fy, ty); fx >>= , tx >>= ; } } int main(){ freopen("in.txt", "r", stdin); int T; cin >> T; while (T--){ scanf("%d%d", &n, &q); sz = ; ; memset(tr, , sizeof(tr)); while (q--){ ]; scanf("%s", op); ] == 'Q'){ int x, y; scanf("%d%d", &x, &y); bool ans = query(x, y); printf("%d\n", ans); } else{ int fx, fy, tx, ty; scanf("%d%d%d%d", &fx, &fy, &tx, &ty); if (fx > tx)swap(fx, tx); if (fy > ty)swap(fy, ty); update(fx, fy, tx, ty); } } putchar();//换行是10,回车13,空格32 } ; }
POJ2155 Matrix二维线段树经典题的更多相关文章
- POJ2155 Matrix 二维线段树
关键词:线段树 二维线段树维护一个 维护一个X线段的线段树,每个X节点维护一个 维护一个Y线段的线段树. 注意,以下代码没有PushDownX.因为如果要这么做,PushDownX时,由于当前X节点的 ...
- hdu1823(二维线段树模板题)
hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
题意: 有一个n*n的矩阵,初始化全部为0.有2中操作: 1.给一个子矩阵,将这个子矩阵里面所有的0变成1,1变成0:2.询问某点的值 方法一:二维线段树 参考链接: http://blog.csdn ...
- POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询
本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样, ...
- poj 2155 matrix 二维线段树 线段树套线段树
题意 一个$n*n$矩阵,初始全为0,每次翻转一个子矩阵,然后单点查找 题解 任意一种能维护二维平面的数据结构都可以 我这里写的是二维线段树,因为四分树的写法复杂度可能会退化,因此考虑用树套树实现二维 ...
- Mosaic HDU 4819 二维线段树入门题
Mosaic Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others)Total S ...
- poj 2155 matrix 二维线段树
题目链接 区间翻转, 单点查询, 查询操作我真是不太明白...... #include <iostream> #include <vector> #include <cs ...
- POJ2155 Matrix 【二维线段树】
题目链接 POJ2155 题解 二维线段树水题,蒟蒻本想拿来养生一下 数据结构真的是有毒啊,, TM这题卡常 动态开点线段树会TLE[也不知道为什么] 直接开个二维数组反倒能过 #include< ...
- poj 1195:Mobile phones(二维线段树,矩阵求和)
Mobile phones Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 14391 Accepted: 6685 De ...
随机推荐
- linux下如何打包压缩?解包解压?.tar文件.gz文件
===文件打包.压缩 ==打包 tar [root@521478.com]# tar -cvf etc1.tar /etc //c创建 v详细 f打包后文件名 [root@521478.com]# t ...
- XP系统下IIS常见的几个问题
随笔说明: 个人笔记.仅供参考 根据日常遇到的相关问题不定期增改 时间:2015年1月7日23:09 Soft:Microsoft .NET Framework 4(独立安装程序) Microsoft ...
- Debian Environment Variables
原文:EnvironmentVariables General Environment variables are named strings available to all application ...
- 大话设计模式C++版——原则和引言
转贴请注明转自:http://blog.csdn.net/gufeng99/article/details/45832711 读程杰的<大话设计模式>有一段时间了,将其C#版的设计模式代码 ...
- label的for属性
一.使用介绍 <label>专为input元素服务,为其定义标记. for属性规定label与哪个表单元素绑定 label和表单控件绑定方式又两种: 1.将表单控件作为label的内容,这 ...
- .Net程序员之Python基础教程学习----判断条件与循环[Fourth Day]
今天学习Python的判断条件与循环操作. 一. 布尔变量: 在学习判断条件之前必须的了解bool变量,在Python中bool变量与C语言比较类似,与.net差别比较大,其中下面集中情况需要 ...
- 第一篇使用Markdown的文章
一级标题 1 计算机 |计算机|科学| Foo 这段文字需要被强调 this is H1 ========== this is H2 ---------- 这是H1 这是H2 这是H3 这是H6 断好 ...
- Android 实现页面的延时跳转
Android APP在初次使用的时候往往会出现APP的首页标志,然后几秒之后进入导航页,今天就记录一下,首页的延时跳转的两种方法: 第一种使用Handler延时跳转,在onCreate的方法中加入一 ...
- AC日记——数字统计 openjudge 1.5 41
41:数字统计 总时间限制: 1000ms 内存限制: 65536kB 描述 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数. 比如给定范围[2, 22],数字2在数2中出现了1次, ...
- luogu1003铺地毯[noip2011 提高组 Day1 T1]
题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...