POJ - 2155 Matrix 【树状数组】【二维区间修改单点查询】

POJ - 2155 Matrix

题目链接:https://vjudge.net/problem/POJ-2155#author=happypeople

题目

给定 n* n 矩阵A,其元素为0或1. A [i][j] 表示第i行和第j列中的数字。最初全为0.

我们有两个操作:

1. C x1 y1 x2 y2(1 <= x1 <= x2 <= n,1 <= y1 <= y2 <= n)将左上角为(x1,y1),右下角为(x2,y2)的矩阵翻转(0变成1,1变成0)。

2. Q x y(1 <= x,y <= n)查询A [x][y],输出答案。

思路

二维树状数组,区间修改,单点查询模板题

代码

#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug  freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e6+10;
using namespace std;

int T,N,Q;
int tr[1010][1010];

int lowbit(int x){
    return x&-x;
}
void add(int x,int y,int v){
    for(int i = x;i<=N;i += lowbit(i))
        for(int j = y;j<=N;j += lowbit(j))
            tr[i][j] += v;
}
int query(int x,int y){
    int sum = 0;
    for(int i = x;i>=1;i -= lowbit(i))
        for(int j = y;j>=1;j -= lowbit(j))
            sum += tr[i][j];
    return sum;
}
int main(){
    ios;
    cin>>T;
    int tag = 0;
    while(T--){
        if(tag) cout<<'\n';tag = 1;
        memset(tr,0,sizeof tr);
        cin>>N>>Q;
        string op;int x1,y1,x2,y2;
        while(Q--){
            cin>>op;
            if(op == "C"){
                cin>>x1>>y1>>x2>>y2;
                add(x1,y1,+1);
                add(x1,y2+1,-1);
                add(x2+1,y1,-1);
                add(x2+1,y2+1,+1);
            }else{
                cin>>x1>>y1;
                cout<<query(x1,y1) % 2 <<'\n';
            }
        }
    }
    return 0;
}
Ryuichi的算法分享 文章被收录于专栏

分享我的一些算法题解,致力于把题解做好,部分题解可能会采用视频的形式来讲解。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务