`
128kj
  • 浏览: 594876 次
  • 来自: ...
社区版块
存档分类
最新评论

二维树状数组学习之二:练习POJ 1195

阅读更多
接前文:二维树状数组学习之一:彻底理解http://128kj.iteye.com/blog/1746732

POJ1195题意:大概题意如下:给出一个n*n的矩阵,初始化为均为0,还有关于这个矩阵的几种操作,操作如下:
命令0:n (给出矩阵的维数)
命令1:(X Y A) 对位于坐标(X Y)的值加A;
命令2:(L B R T)求出位于L<=x<=R,B<=y<=T的子矩阵的值的和;
命令3:退出不做任何操作。


分析如下:典型的二维树状数组,典型的动态操作题目。查询子矩阵(x,y,xx,yy)的元素和,注意一下就可以了:

sum(xx, yy)-sum(x-1, yy)-sum(xx, y-1)+sum(x-1,y-1);



所求的子矩阵和是要包含边界的,所以减去的部分就不能包含边界

样例:

Sample Input

0 4         //命令0
1 1 2 3     //命令1
2 0 0 2 2   //命令2
1 1 1 2
1 1 2 -1
2 1 1 2 3
3           //命令3

Sample Output

3
4

AC过的代码:
import java.util.Scanner;
 public class Main{
  int n;//二维数组的维数n*n
  int[][] C;   //二维树状数组
  
  public Main(){
   }

   private int lowbit(int t){  
       return t&(-t);   
    }  
 
    
    private int Sum(int i, int j){//求子矩阵的和,前i行,前j列
      int result = 0;
      for(int x = i; x > 0; x -= lowbit(x)) {
        for(int y = j; y > 0; y -= lowbit(y)) {
            result += C[x][y];
        }
      }
     return result;
   }

     private void Modify(int i, int j, int delta){//修改二维数组的某一项(i,j)
         
       // A[i][j]+=delta;
     
       for(int x = i; x<=n; x += lowbit(x))
        for(int y = j; y <=n; y += lowbit(y)){
          C[x][y] += delta;
        
        }
     }
   
     public static void  main(String[] args){   
       Main ma=new Main();
        ma.go();
     }

     private void go(){
      int k,a,b,cc,x,y;   
      Scanner in=new Scanner(System.in);
       while(true){
         k=in.nextInt();
         if(k==3) break;
         if(k==0){
             n=in.nextInt();
             C=new int[n+1][n+1];
         }else if(k==1){
             a=in.nextInt();
             b=in.nextInt();
             cc=in.nextInt();
             a++;
             b++;
             Modify(a,b,cc);//命令1
          }else{
             x=in.nextInt();//命令2
             y=in.nextInt();
             a=in.nextInt();
             b=in.nextInt();
             x++;
             y++;
             a++;
             b++;
              //所求的子矩阵和是要包含边界的,所以减去的部分就不能包含边界
             System.out.printf("%d\n",Sum(a,b)+Sum(x-1,y-1)-Sum(a,y-1)-Sum(x-1,b));
          }
       }
     }
 }
   


  • 大小: 1.9 KB
0
0
分享到:
评论

相关推荐

    二维树状数组练习 POJ 2029

    它扩展了一维树状数组(也称作线段树),能够处理二维或多维的数组更新和查询操作。在POJ 2029这个题目中,我们可能面临的问题是需要对一个二维矩阵进行动态更新和求和查询,例如计算某一个矩形区域内的元素总和。 ...

    树状数组练习:POJ 3067

    【标题】"树状数组练习:POJ 3067" 树状数组,也称为线段树(Segment Tree),是一种高效的数据结构,用于处理区间查询和修改问题。在这个问题中,我们通过分析POJ 3067的题目来探讨如何应用树状数组解决实际问题。...

    树状数组练习:POJ 2481(JAVA)

    【标题】"树状数组练习:POJ 2481(JAVA)" 是一篇关于使用树状数组(也称为线段树)解决编程竞赛问题的文章。这篇文章可能详细讲解了如何运用这种数据结构来解决特定的问题POJ 2481。POJ(Programming Online Judge)...

    图的深搜+树状数组练习 POJ 3321(JAVA)

    标题中的“图的深搜+树状数组练习 POJ 3321(JAVA)”指的是一个编程题目,其中涉及到图的深度优先搜索(DFS, Depth First Search)算法和树状数组(也称为线段树,Segment Tree)的数据结构。这个题目来源于POJ...

    树状数组题解1

    这是一个二维矩阵的操作问题,树状数组在这里扩展到了二维,称为二维树状数组或棋盘树。同样,它支持区间查询和修改。对于矩阵中的每个元素,可以通过二维树状数组在常数时间内完成子矩阵的求和操作,从而高效地处理...

    树状数组题目集

    **题目**:POJ2155是一道涉及二维树状数组的问题,这里简化为一维情况讨论。 - **操作**: 1. 修改区间`(a, b)`内所有元素。 2. 查询点`(a)`的值。 - **解决方案**:通过对树状数组的进一步改造,可以解决此类问题...

    poj题目分类

    * 树状树组:例如 poj1195、poj3321。 * RMQ:例如 poj3264、poj3368。 * 并查集的高级应用:例如 poj1703、poj2492。 * KMP 算法:例如 poj1961、poj2406。 4. 搜索: * 最优化剪枝和可行性剪枝。 * 搜索的...

    经典 的POJ 分类

    - POJ 3264、POJ 3368:树状数组的构造与更新。 #### 字符串匹配 - **题目示例**: - POJ 1961、POJ 2406:KMP算法的应用。 ### 其他问题 #### 贪心算法 - **题目示例**: - POJ 3411、POJ 1724:贪心策略的...

    滚动数组应用:POJ 1159

    标题“滚动数组应用:POJ 1159”指的是一个关于编程竞赛问题的解决方案,该问题在POJ(Programming Online Judge)平台上被提出。滚动数组是一种优化动态规划算法的技术,通过巧妙地重用和更新已经计算过的状态,减少...

    poj 2352 stars(树状数组,线段树)

    ### POJ 2352 Stars - 树状数组与线段树实现 #### 题目背景 POJ 2352 Stars 是一道经典的算法题目,它提供了使用树状数组或线段树来解决的可能性。这两种数据结构都是为了高效处理区间查询问题而设计的。在这篇...

    acm新手刷题攻略之poj

    ### ACM新手刷题攻略之POJ 在ACM竞赛领域,特别是对于初学者而言,选择合适的平台进行训练至关重要。POJ(Peking University Online Judge)作为国内最早且最知名的在线评测系统之一,拥有丰富的题库资源,对于提高...

    树状数组(Binary Indexed Tree)

    7. **二维树状数组 POJ2155:Matrix** - **题意**:给定一个n*n的矩阵,支持对子矩阵进行翻转操作,并查询特定位置的值。 - **解法**:通过构建二维树状数组来实现对子矩阵的翻转操作,并进行查询。 #### 总结 ...

    ACMer需要掌握的算法讲解 (2).docx

    ACM算法讲解 本文将对ACM主要算法进行讲解,涵盖了基本算法、图算法、数据结构、搜索、计算几何学、动态规划和综合题等多... + 一维线段树二维线段树树状数组 + 字典树 + 后缀数组、后缀树 + 块状链表 + 哈夫曼树

    ACM 题型

    2. **树形结构** - 示例题目:poj2388, poj2299 3. **字典树(Trie)** - 字典树是一种高效的数据结构,用于存储大量字符串。 - 示例题目:poj2513 4. **哈希表** - **散列表的应用**:常用于快速查找、插入和...

    poj_2682(3).rar_C++ 数组扩充_poj 26_poj 2682_poj26

    "C++ 数组扩充"提示我们问题可能与如何在C++编程语言中处理数组的增长有关,而"poj 26_poj 2682_poj26"似乎是重复提及问题编号,可能是用户在整理文件时的习惯。 描述中提到的“数链思想”可能是指一种处理数组元素...

    学习凸包(三):凸包练习 POJ 1113

    这篇博客“学习凸包(三): 凸包练习 POJ 1113”显然是关于如何通过编程解决凸包问题的一个实例。我们将深入探讨这个话题,主要关注凸包的定义、常见的求解算法以及如何用Java实现。 凸包可以被定义为一个给定集合中...

    POJ2676-Sudoku

    1. **数组与矩阵**:数独的结构可以用二维数组或矩阵来表示,每个单元格对应数组的一个元素。在C++中,可以使用二维动态数组或`std::vector&lt;std::vector&lt;int&gt;&gt;`来实现。 2. **深度优先搜索(DFS)**:一种常见的...

    2010FZUACM_高级数据结构习题讲解1

    以上就是高级数据结构习题讲解中的核心知识点,包括树状数组、二维和三维树状数组的使用,线段树在处理区间问题上的应用,动态规划和并查集在特定问题中的策略。理解并掌握这些工具和方法,有助于解决复杂的算法竞赛...

Global site tag (gtag.js) - Google Analytics