poj2155
2016-01-17 12:35
218 查看
链接:点击打开链接
题意:给一个N*N的矩阵,初始每个元素都为0,有两种指令,第一种给出一个子矩阵的左上角和右上角,使其中每个元素都取反,第二种询问某一个点的值
代码:
题意:给一个N*N的矩阵,初始每个元素都为0,有两种指令,第一种给出一个子矩阵的左上角和右上角,使其中每个元素都取反,第二种询问某一个点的值
代码:
#include <stdio.h> #include <string.h> #include <iostream> using namespace std; const int SIZE=1005; int n,X1,X2,Y1,Y2,ans; int sum[SIZE<<2][SIZE<<2]; void updatey(int l,int r,int rtx,int rty){ int m; if(Y1<=l&&r<=Y2){ sum[rtx][rty]^=1; return; } m=(l+r)>>1; if(Y1<=m) updatey(l,m,rtx,rty<<1); if(Y2>m) updatey(m+1,r,rtx,rty<<1|1); } void updatex(int l,int r,int rtx){ int m; if(X1<=l&&r<=X2){ updatey(1,n,rtx,1); //先改X的区间再改Y的区间 return; } m=(l+r)>>1; if(X1<=m) updatex(l,m,rtx<<1); if(X2>m) updatex(m+1,r,rtx<<1|1); } void query_y(int l,int r,int rtx,int rty,int y){ int m; ans^=sum[rtx][rty]; if(l==r) return; m=(l+r)>>1; if(y<=m) query_y(l,m,rtx,rty<<1,y); if(y>m) query_y(m+1,r,rtx,rty<<1|1,y); } void query_x(int l,int r,int rtx,int x,int y){ int m; query_y(1,n,rtx,1,y); //因为我们实际算的是变换了多少次,因此 if(l==r) //先找大区间后找小区间 return; m=(l+r)>>1; if(x<=m) query_x(l,m,rtx<<1,x,y); if(x>m) query_x(m+1,r,rtx<<1|1,x,y); } int main(){ //对矩阵进行更新和修改,因此用到二维 int t,m,x,y; //线段树 char c; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); memset(sum,0,sizeof(sum)); //因为矩阵初始为0,因此可以省去建树的过程 while(m--){ ans=0; getchar(); scanf("%c",&c); if(c=='C'){ scanf("%d%d%d%d",&X1,&Y1,&X2,&Y2); updatex(1,n,1); } else{ scanf("%d%d",&x,&y); query_x(1,n,1,x,y); printf("%d\n",ans); } } printf("\n"); } return 0; }
相关文章推荐
- 使用Echarts进行可视化的数据线呈现
- 2127: happiness 最小割
- MFC 定义和调用全局变量的一种方法
- Android异常: android.content.res.Resources$NotFoundException: String resource ID #0x4d3b3d50
- 移动互联网-----概述
- UML全家福
- VS 2013 统一修改所有工程的目录配置(以 boost、opencv3 的安装为例)
- 线程优先级
- MFC 打开其他程序
- Arcgis for javascript不同的状态下自己定义鼠标样式
- MFC 打开文件夹 调用其他程序 打开文件
- 哈夫曼树_1172
- 算法与数据结构学习资源大搜罗——良心推荐
- java中public protected private修饰符
- NPOI 利用DataTable导出Excel 2003和2007
- 蔡英文胜选后发表演讲(全文)
- Team Formation 浙江省省赛原题
- 南沙政府应急系统之GIS一张图(arcgis api for flex)讲解(十三)台风模块
- 船长 | 我们在Club全栈创业
- MFC 打开文件对话框 打开单个文件