zoukankan      html  css  js  c++  java
  • POJ 2155 Matrix (二维线段树)

    Matrix
    Time Limit: 3000MS   Memory Limit: 65536K
    Total Submissions: 17226   Accepted: 6461

    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

    POJ Monthly,Lou Tiancheng

    这题二维线段树也可以做。

    二维线段树需要  给一个矩形加一个值

    查询单个的值。

    加值的时候直接加一个块。

    查询的时候把这个点以及和这个点相关的都累加起来。

    数据结构写法多样啊,重在理解

      1 /* ***********************************************
      2 Author        :kuangbin
      3 Created Time  :2014/5/23 23:08:19
      4 File Name     :E:2014ACM专题学习数据结构二维线段树POJ2155.cpp
      5  ************************************************ */
      6 
      7 #include <stdio.h>
      8 #include <string.h>
      9 #include <iostream>
     10 #include <algorithm>
     11 #include <vector>
     12 #include <queue>
     13 #include <set>
     14 #include <map>
     15 #include <string>
     16 #include <math.h>
     17 #include <stdlib.h>
     18 #include <time.h>
     19 using namespace std;
     20 const int MAXN = 1010;
     21 struct Nodey
     22 {
     23     int l,r;
     24     int val;
     25 };
     26 int n;
     27 int locx[MAXN],locy[MAXN];
     28 struct Nodex
     29 {
     30     int l,r;
     31     Nodey sty[MAXN*3];
     32     void build(int i,int _l,int _r)
     33     {
     34         sty[i].l = _l;
     35         sty[i].r = _r;
     36         sty[i].val = 0;
     37         if(_l == _r)
     38         {
     39             locy[_l] = i;
     40             return;
     41         }
     42         int mid = (_l + _r)>>1;
     43         build(i<<1,_l,mid);
     44         build((i<<1)|1,mid+1,_r);
     45     }
     46     void add(int i,int _l,int _r,int val)
     47     {
     48         if(sty[i].l == _l && sty[i].r == _r)
     49         {
     50             sty[i].val += val;
     51             return;
     52         }
     53         int mid = (sty[i].l + sty[i].r)>>1;
     54         if(_r <= mid)add(i<<1,_l,_r,val);
     55         else if(_l > mid)add((i<<1)|1,_l,_r,val);
     56         else
     57         {
     58             add(i<<1,_l,mid,val);
     59             add((i<<1)|1,mid+1,_r,val);
     60         }
     61     }
     62 }stx[MAXN*3];
     63 void build(int i,int l,int r)
     64 {
     65     stx[i].l = l;
     66     stx[i].r = r;
     67     stx[i].build(1,1,n);
     68     if(l == r)
     69     {
     70         locx[l] = i;
     71         return;
     72     }
     73     int mid = (l+r)>>1;
     74     build(i<<1,l,mid);
     75     build((i<<1)|1,mid+1,r);
     76 }
     77 void add(int i,int x1,int x2,int y1,int y2,int val)
     78 {
     79     if(stx[i].l == x1 && stx[i].r == x2)
     80     {
     81         stx[i].add(1,y1,y2,val);
     82         return;
     83     }
     84     int mid = (stx[i].l + stx[i].r)/2;
     85     if(x2 <= mid)add(i<<1,x1,x2,y1,y2,val);
     86     else if(x1 > mid)add((i<<1)|1,x1,x2,y1,y2,val);
     87     else 
     88     {
     89         add(i<<1,x1,mid,y1,y2,val);
     90         add((i<<1)|1,mid+1,x2,y1,y2,val);
     91     }
     92 }
     93 int sum(int x,int y)
     94 {
     95     int ret = 0;
     96     for(int i = locx[x];i;i >>= 1)
     97         for(int j = locy[y];j;j >>= 1)
     98             ret += stx[i].sty[j].val;
     99     return ret;
    100 }
    101 
    102 int main()
    103 {
    104     //freopen("in.txt","r",stdin);
    105     //freopen("out.txt","w",stdout);
    106     int T;
    107     scanf("%d",&T);
    108     while(T--)
    109     {
    110         int q;
    111         scanf("%d%d",&n,&q);
    112         build(1,1,n);
    113         char op[10];
    114         int x1,x2,y1,y2;
    115         while(q--)
    116         {
    117             scanf("%s",op);
    118             if(op[0] == 'C')
    119             {
    120                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
    121                 add(1,x1,x2,y1,y2,1);
    122             }
    123             else
    124             {
    125                 scanf("%d%d",&x1,&y1);
    126                 if(sum(x1,y1)%2 == 0)printf("0
    ");
    127                 else printf("1
    ");
    128             }
    129         }
    130         if(T)printf("
    ");
    131     }
    132     return 0;
    133 }
  • 相关阅读:
    PAT甲级1107. Social Clusters
    PAT甲级1103. Integer Factorization
    PAT甲级1098. Insertion or Heap Sort
    hihocoder 162周 1323 : 回文字符串
    PAT甲级1095. Cars on Campus
    PAT甲级1089. Insert or Merge
    PAT甲级1087. All Roads Lead to Rome
    PAT甲级1076. Forwards on Weibo
    PAT甲级1066. Root of AVL Tree
    PAT甲级1057. Stack
  • 原文地址:https://www.cnblogs.com/kuangbin/p/3749086.html
Copyright © 2011-2022 走看看