POJ2155:Matrix(二维树状数组,经典)「建议收藏」

POJ2155:Matrix(二维树状数组,经典)

大家好,又见面了,我是全栈君。

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

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

Sample Output

1
0
0
1

Source


#include <iostream>#include <stdio.h>#include <string.h>#include <string>#include <stack>#include <queue>#include <map>#include <set>#include <vector>#include <math.h>#include <bitset>#include <list>#include <algorithm>#include <climits>using namespace std;#define lson 2*i#define rson 2*i+1#define LS l,mid,lson#define RS mid+1,r,rson#define UP(i,x,y) for(i=x;i<=y;i++)#define DOWN(i,x,y) for(i=x;i>=y;i--)#define MEM(a,x) memset(a,x,sizeof(a))#define W(a) while(a)#define gcd(a,b) __gcd(a,b)#define LL long long#define N 1005#define INF 0x3f3f3f3f#define EXP 1e-8#define lowbit(x) (x&-x)const int mod = 1e9+7;int c[N][N],n,m,cnt,s,t;int a[N][N];int sum(int x,int y){    int ret = 0;    int i,j;    for(i = x;i>=1;i-=lowbit(i))    {        for(j = y;j>=1;j-=lowbit(j))        {            ret+=c[i][j];        }    }    return ret;}void add(int x,int y){    int i,j;    for(i = x;i<=n;i+=lowbit(i))    {        for(j = y;j<=n;j+=lowbit(j))        {            c[i][j]++;        }    }}int main(){    int i,j,x,y,ans,t;    int x1,x2,y1,y2;    char op[10];    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        MEM(c,0);        MEM(a,0);        while(m--)        {            scanf("%s",op);            if(op[0]=='C')            {                scanf("%d%d%d%d",&x1,&y1,&x2,&y2);                x1++,y1++,x2++,y2++;                add(x2,y2);                add(x1-1,y1-1);                add(x2,y1-1);                add(x1-1,y2);            }            else            {                scanf("%d%d",&x1,&y1);                x2 = x1,y2 = y1;                x1++,y1++,x2++,y2++;                printf("%d\n",sum(x1,y1));            }        }        printf("\n");    }    return 0;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/116489.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 近期的一些研究目标

    近期的一些研究目标

  • JAVA对象转JSON字符串时格式化日期_oracle clob转字符串

    JAVA对象转JSON字符串时格式化日期_oracle clob转字符串本案例所有代码均为原创,使用Java手写,没有借鉴其他类似工具库和网上论坛博客,也许没有经过充分测试,可能出现未知bug,因此不建议拿到正式的项目里使用。Java对象就像一个文件夹一样,没有办法知道其深度,所以采用了递归。性能方面没有测试,个人认为没有特别耗费性能的地方,除非你的对象包含很多层级。它可以支持null,字符串,数字、日期、集合等多种类型,包括以上类型的多层嵌套,都没有问题。源码不多,如下:importjava.lang.reflect.Field;importjava.lang

  • 大数据建模步骤有哪些

    大数据建模步骤有哪些  数据建模,通俗地说,就是通过建立数据科学模型的手段解决现实问题的过程。数据建模也可以称为数据科学项目的过程,并且这个过程是周期性循环的,也是是我们在做数据分析的时候会经常使用的一种数据分析方法,那么大数据建模都有哪些步骤。  1)数据测量  数据测量包括ECU内部数据获取,车内总线数据获取以及模拟量数据获取,特别是对于新能源汽车电机、逆变器和整流器等设备频率高达100KHz的信号测量,ETAS提供完整的解决方案。  2)大数据管理与分析  目前的汽车嵌入式控制系统…

  • 安卓 toast_安卓toast使用

    安卓 toast_安卓toast使用概述一个toast是在屏幕上弹出一条信息,它的大小总是包裹着需要显示的内容,并且当前的Activity依然是可见并且可互动的。toast会自动消失,并且不接受任何互动事件。因为toast可以在后台的 Service 中创建,所以即使这个应用程序没有显示在屏幕上,仍然可以弹出toast.toast最好用来显示简要的信息,比如断定用户正在注意屏幕时,弹出”Fil

  • 教你如何选择以太坊ETH挖矿教程及挖矿分配模式

    教你如何选择以太坊ETH挖矿教程及挖矿分配模式现在,国内国外的矿池越来越多,挖矿难度也越来越大,对于矿工来说,又好又稳定的收益保障一直是追求的目标。以太坊ETH,全球第二大加密货币,对以太坊的追求者都有一种浓重的信仰与情怀,特别是最近消息称以太坊2.0即将来临,更加的激动人心。但最终的目的也是要获得收益,影响收益最大的因素就是矿池收益分配模式,现在矿池收益分配模式有:PPS、PPLNS、PPS+、FPPS等。那么,对于挖以太坊ETH来说…

  • 75道面试逻辑智力测试题内附详细答案「建议收藏」

    75道面试逻辑智力测试题内附详细答案「建议收藏」【1】假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。问题是如何只用这2个水壶从池塘里取得3升的水。答案:由满6向空5倒,剩1升,把这1升倒5里,然后6剩满,倒5里面,由于5里面有1升水,因此6只能向5倒4升水,然后将6剩余的2升,倒入空的5里面,再灌满6向5里倒3升,剩余3升。【2】周雯的妈妈是豫林水泥厂的化验员。一天,周雯来到化验室做作业。做完后想出去玩…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号