zoukankan      html  css  js  c++  java
  • poj 2155 Matrix 二维树状数组

    题目链接:

    http://poj.org/problem?id=2155

    题意:

    给出N*N的矩阵,初始为0。
    给出矩阵左上角和右下角坐标,这个面积范围里的元素 1变0 ,0 变1,然后给出询问,问某个点是多少。

    题解:

    http://blog.csdn.net/zxy_snow/article/details/6264135
    我们将1变0,0变1转变为将这一块面积翻转几次,奇数次就是1,偶数次就是0。
    二维数组维护面积,加加减减。。
    add(x2,y2);
    add(x1-1,y2);
    add(x2,y1-1);
    add(x1-1,y1-1);
    看图:虽然非常丑,对于翻转一块面积,先翻转整体,减掉多加的,加上多减的,图上的数字代表这块面积翻转了几次,偶数次代表没有改变嘛。
    这里写图片描述

    代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <cstring>
     5 using namespace std;
     6 typedef long long ll;
     7 #define MS(a) memset(a,0,sizeof(a))
     8 #define MP make_pair
     9 #define PB push_back
    10 const int INF = 0x3f3f3f3f;
    11 const ll INFLL = 0x3f3f3f3f3f3f3f3fLL;
    12 inline ll read(){
    13     ll x=0,f=1;char ch=getchar();
    14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    16     return x*f;
    17 }
    18 //////////////////////////////////////////////////////////////////////////
    19 const int maxn = 1e3+10;
    20 
    21 int bit[maxn][maxn];
    22 
    23 void add(int x,int y){
    24     for(int i=x; i<maxn; i+=i&-i)
    25         for(int j=y; j<maxn; j+=j&-j)
    26             bit[i][j]++;
    27 }
    28 
    29 int sum(int x,int y){
    30     int res = 0;
    31     for(int i=x; i>0; i-=i&-i)
    32         for(int j=y; j>0; j-=j&-j)
    33             res += bit[i][j];
    34     return res;
    35 }
    36 
    37 int main(){
    38     int T = read();
    39     while(T--){
    40         MS(bit);
    41         int n,k;
    42         cin >> n >> k;
    43         for(int i=0; i<k; i++){
    44             char op; scanf(" %c",&op);
    45             if(op == 'C'){
    46                 int x1,y1,x2,y2; scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    47                 x1++,y1++,x2++,y2++;
    48                 add(x2,y2);
    49                 add(x1-1,y1-1);
    50                 add(x1-1,y2);
    51                 add(x2,y1-1);
    52             }else {
    53                 int x,y; scanf("%d%d",&x,&y);
    54                 cout << sum(x,y)%2 << endl;
    55             }
    56         }
    57         puts("");
    58     }
    59 
    60     return 0;
    61 }
  • 相关阅读:
    存储过程的设计规则
    企业管理器里删除不需要的注册
    SQL Server 大数据量插入和索引关系
    【2011520】无法使用主机名连接数据库
    SQL Server 查看存储过程
    SQL Server dbcc inputbuffer
    如何选择行版本的隔离级别
    ObjectiveC中Selector基本概念和操作
    Objectivec的@property 详解
    objectivec 关键字和概念
  • 原文地址:https://www.cnblogs.com/yxg123123/p/6827567.html
Copyright © 2011-2022 走看看