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添加开机自启动脚本示例详解
linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的; 一.在/etc/rc.local中添加如果不想将脚本粘来粘去,或创建链接什么的,则:step1. 先修改好脚本,使其所有 ...
- linux 分区 物理卷 逻辑卷
今天我们主要说说分区.格式化.SWAP.LVM.软件RAID的创建哈~ 格式化 查看当前分区:fdisk -l 这个命令我们以前是讲过的,我现在问下,ID那项是什么意思? 83 是代表EXT2和E ...
- App_Data 目录中的数据库位置指定了一个本地 SQL Server
<configuration> <system.web> <compilation debug="true" targetFramework=&quo ...
- sqlserver 用 RowNumber 分组
SELECT RECORD.[RECORD_ID] ,RECORD.[WORKFLOW_INFO_ID] ,RECORD.[FORM_CODE] ,RECORD.[APPLY_DATE] ,RECOR ...
- 如何用ZBrush做人体造型雕刻
之前我们用ZBrush®中的Curves和Insert笔刷快速创建模型的躯干.四肢以及手指.经过老师耐心的讲解我们也收获了很多,知道了创建模型的流程和雕刻技巧.今天的ZBrush教程将结合一些新的雕刻 ...
- Codeforces 486E LIS of Sequence --树状数组求LIS
题意: 一个序列可能有多个最长子序列,现在问每个元素是以下三个种类的哪一类: 1.不属于任何一个最长子序列 2.属于其中某些但不是全部最长子序列 3.属于全部最长子序列 解法: 我们先求出dp1[i] ...
- System V进程间通信
一)Linux环境进程间通信(一)管道及有名管道http://www.ibm.com/developerworks/cn/linux/l-ipc/part1/二)Linux环境进程间通信(二): 信号 ...
- tomocat设置首次访问时的页面
怎么设置Tomcat服务器的默认首页(欢迎页) 一般做Java web开发,有时候会选择Tomcat用作服务器,我在本机开发测试用的也是Tomcat,现在有一个问题是,我们都知道当访问一个网站的时候, ...
- Android M新的运行时权限开发者需要知道的一切
android M 的名字官方刚发布不久,最终正式版即将来临!android在不断发展,最近的更新 M 非常不同,一些主要的变化例如运行时权限将有颠覆性影响.惊讶的是android社区鲜有谈论这事儿, ...
- 小Y的棋盘问题 题解
有一个n*m的棋盘,上面有一些棋子,每行每列最多只会有一个棋子,不会有两个棋子八连通.问随机一个空格子作为起点,再随机地选择一个空格子作为终点,求问不经过任意棋子最短路的期望长度是多少.多组,n,m& ...