POJ2155 Matrix二维线段树
2015-08-20 11:53
218 查看
一,题意:
给你一个全为0的N * N的矩阵,对这个矩阵有两个操作(对于矩阵只有两个状态0,1)
(1):“C x1,y1,x2,y2” 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转。
(2):“Q x1 y1” 输出a[x1][y1]的值。
二,解析:
该我主要应用令二位的树状数组,一个是行,一个是列。
三,代码:
给你一个全为0的N * N的矩阵,对这个矩阵有两个操作(对于矩阵只有两个状态0,1)
(1):“C x1,y1,x2,y2” 就是将左上角为x1,y1,右下角为x2,y2,的这个矩阵内的数字全部翻转。
(2):“Q x1 y1” 输出a[x1][y1]的值。
二,解析:
该我主要应用令二位的树状数组,一个是行,一个是列。
三,代码:
#include<iostream> #include<cstdio> #include <stdlib.h> #include <string.h> using namespace std; const int Max=1002; int Mat[Max][Max]; //Mat[i][j] 表示(i,j)到(n,n)区间改变次数 int N,T,X; char str; int step(int x) { return x&(-x); } int sum(int x,int y) {//包含点(x,y)取区间改变次数和即(0.0)到(x,y)区间和; int total=0; for(int i=x; i>0; i-=step(i)) for(int j=y; j>0; j-=step(j)) total+=Mat[i][j]; return total; } void change(int x,int y) {//将(x,y)到(n,n)区间反转增加一次 for(int i=x; i<=N; i+=step(i)) for(int j=y; j<=N; j+=step(j)) Mat[i][j]++; } int main() { scanf("%d",&X); while(X--) { scanf("%d%d",&N,&T); memset(Mat,0,sizeof(Mat)); while(T--) { getchar(); scanf("%c",&str); if(str=='C') { int x_1,y_1,x_2,y_2; scanf("%d%d%d%d",&x_1,&y_1,&x_2,&y_2); change(x_1,y_1); change(x_1,y_2+1); change(x_2+1,y_1); change(x_2+1,y_2+1); } else { int x,y; scanf("%d%d",&x,&y); int key=sum(x,y); printf("%d\n",key%2); } } printf("\n"); } return 0; }
相关文章推荐
- unity3D导入导出资源包
- bzoj2658: [Zjoi2012]小蓝的好友(mrx)
- error LNK2001: unresolved external symbol _GetFileVersionInfoA@16解决办法
- 菜鸟心中理解的大数据
- android studio mac下需要jdk1.6
- Hibernate学习之hibernate状态
- iOS基础知识点
- pdf如何转换成html格式方法介绍
- setTextFormat和defaultTextFormat的用法
- 数据结构与算法分析——最大公约数
- mysql基于amoeba的读写分离
- ICA(1)
- 图像倾斜矫正方程基本的图像变换
- 汉字转拼音 汉字排序功能
- 创建线程的两种方式及原理
- UE4 GPU Profiling
- Geometric Shapes - POJ 3449
- 【拾遗】C++ STL容器begin(),end()
- jQuery里$(this)和this的区别在哪?
- BZOJ2658: [Zjoi2012]小蓝的好友(mrx)