博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ2155:Matrix
阅读量:5339 次
发布时间:2019-06-15

本文共 2874 字,大约阅读时间需要 9 分钟。

Matrix
Time Limit: 3000MS   Memory Limit: 65536K
Total Submissions: 32921   Accepted: 11933

Description

Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1 <= i, j <= N). 
We can change the matrix in the following way. Given a rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2), we change all the elements in the rectangle by using "not" operation (if it is a '0' then change it into '1' otherwise change it into '0'). To maintain the information of the matrix, you are asked to write a program to receive and execute two kinds of instructions. 
1. C x1 y1 x2 y2 (1 <= x1 <= x2 <= n, 1 <= y1 <= y2 <= n) changes the matrix by using the rectangle whose upper-left corner is (x1, y1) and lower-right corner is (x2, y2). 
2. Q x y (1 <= x, y <= n) querys A[x, y]. 

Input

The first line of the input is an integer X (X <= 10) representing the number of test cases. The following X blocks each represents a test case. 
The first line of each block contains two numbers N and T (2 <= N <= 1000, 1 <= T <= 50000) representing the size of the matrix and the number of the instructions. The following T lines each represents an instruction having the format "Q x y" or "C x1 y1 x2 y2", which has been described above. 

Output

For each querying output one line, which has an integer representing A[x, y]. 
There is a blank line between every two continuous test cases. 

Sample Input

12 10C 2 1 2 2Q 2 2C 2 1 2 1Q 1 1C 1 1 2 1C 1 2 1 2C 1 1 2 2Q 1 1C 1 1 2 1Q 2 1

Sample Output

1001

Source

,Lou Tiancheng
 

题目大意:给你一个初始都为0的n*n的矩阵,Cx1,y1,x2,y2,对这个小矩阵取反,即0->1,1->0,Qx1,y1,查询这个点为1还是0?

二维树状数组裸题

支持区间修改和单点查询

 

由于不能维护每个点的状态,但可以维护每个点的修改次数,若修改次数%2==0,则相当于不发生改变。

#include
#include
#include
#include
#include
#include
#include
using namespace std;void in(int &x){ register char c=getchar();x=0;int f=1; while(!isdigit(c)){ if(c=='-') f=-1;c=getchar();} while(isdigit(c)){x=x*10+c-'0';c=getchar();} x*=f;}const int N=1005;int bit[N][N],t,m,n;int lowbit(int k){ return k&-k;}void add(int x,int y,int z){ int ty=y; while(x<=n){ y=ty; while(y<=n) bit[x][y]+=z,y+=lowbit(y); x+=lowbit(x); }}void change_interval(int x1,int y1,int x2,int y2){ add(x1,y1,1); add(x1,y2+1,-1); add(x2+1,y1,-1); add(x2+1,y2+1,1);}int ask(int x,int y){ int sum=0,ty=y; while(x>0){ y=ty; while(y>0) sum+=bit[x][y],y-=lowbit(y); x-=lowbit(x); }return sum;}int main(){ in(t); while(t--){ memset(bit,0,sizeof(bit)); in(n);in(m); for(int i=1,x1,y1,x2,y2;i<=m;i++){ char p; scanf("%c",&p);in(x1);in(y1); if(p=='C'){ in(x2);in(y2); change_interval(x1,y1,x2,y2); }else{ printf("%d\n",ask(x1,y1)%2); } }printf("\n");//注意,否则会PE }return 0;}

 

转载于:https://www.cnblogs.com/song-/p/9462994.html

你可能感兴趣的文章
Python正则表达式
查看>>
Linux进程间通信--命名管道
查看>>
UVa 10970 - Big Chocolate
查看>>
js输出
查看>>
H5多文本换行
查看>>
HAL层三类函数及其作用
查看>>
Odoo 去掉 恼人的 "上午"和"下午"
查看>>
web@h,c小总结
查看>>
java编程思想笔记(一)——面向对象导论
查看>>
Data Structure 基本概念
查看>>
Ubuntu改坏sudoers后无法使用sudo的解决办法
查看>>
NEYC 2017 游记
查看>>
[搬运] 写给 C# 开发人员的函数式编程
查看>>
Python之旅Day14 JQuery部分
查看>>
core--线程池
查看>>
redux-effect
查看>>
Swift和OC混编
查看>>
Android轻量级的开源缓存框架ASimpleCache
查看>>
他山之石:加载图片的一个小问题
查看>>
shell - 常识
查看>>