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

二维树状数组练习 POJ 2029

阅读更多
关于二维树状数组请参看:http://128kj.iteye.com/blog/1746732
poj2029题意:
   在一块h*w的地上,有n棵柿子树,划t*s的一块矩形地,使得其划到的柿子树最多,输出最多的数量.

样例:
16     //有多少棵树
10 8   //地的规模h*w
2 2    //(2,2)处有一棵树
2 5
2 7
3 3
3 8
4 2
4 5
4 8
6 4
6 7
7 5
7 8
8 1
8 4
9 6
10 3
4 3      //划t*s的一块地,这里是t和s
8
6 4
1 2
2 1
2 4
3 4
4 2
5 3
6 1
6 2
3 2
0

很明显的二维树状数组,穷举t*s的所有位置,并记录其划到的树的个数和最大值.

下面是AC代码:
import java.util.Scanner;
public class Main{
 static final int N=102;
 int C[][];//二维树状数组
 int w;
 int h ;

  private int lowbit(int x ){
    return x & ( -x );
  }

  private void Modify( int x , int y , int c ){
    for (int i = x ; i <= w ; i+= lowbit( i ))
      for (int j = y ; j <= h ; j+= lowbit( j ))
        C[i][j] += c ;
  }

  private   int Sum (int x , int y ){
    int result = 0 ;
    for ( int i = x ; i > 0 ; i -= lowbit( i ))
      for ( int j = y ; j > 0 ; j -= lowbit( j ))
        result += C[i][j] ;
    return result ;
  }

  public static void main(String[] args){
       Main ma=new Main();
       ma.go();
  }
  
   private void go(){
    Scanner in=new Scanner(System.in);
    int n , x , y;
    while(true) {
      n=in.nextInt();
      if(n==0) break;
      w=in.nextInt();
      h=in.nextInt();
      C=new int[w+1][h+1];
      for (int i = 0 ; i < n ; i++ ){
           x=in.nextInt();
           y=in.nextInt();
          Modify(x,y,1 );//将原矩阵(x,y)处的值设置为1,并更新二维树状数组
        }
       x=in.nextInt();
       y=in.nextInt();
       int maxx = -1 ;
       int sx=0;
        for (int  i = x ; i <= w ; i++ )
        {
            for (int j = y ; j <= h ; j++ )
            {
                 sx = Sum (i,j) + Sum (i-x,j-y)-Sum(i-x,j)-Sum(i,j- y );
                if ( sx > maxx )
                maxx = sx ;
            }
        }
       System.out.println(maxx);
    }
  }
}


0
3
分享到:
评论

相关推荐

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

    在本篇中,我们将深入学习二维树状数组的应用,并通过解决POJ 1195问题来实践这一概念。 POJ 1195题目要求我们计算一个二维矩阵中的子矩阵之和。这正是二维树状数组的优势所在,因为我们可以快速地对矩阵的任意矩形...

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

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

    树状数组练习:POJ 3067

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

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

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

    树状数组题解1

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

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

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

    树状数组(Binary Indexed Tree)

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

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

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

    滚动数组应用:POJ 1159

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

    ACM数据结构之树状数组和线段树

    ### ACM数据结构之树状数组和线段树 #### 线段树 线段树是一种非常有效的数据结构,主要用于解决区间查询问题。它能够快速地处理区间内的各种操作,如查询、修改等。 ##### 线段树的定义与特性 线段树本质上是一...

    poj1990.rar_POJ 19_poj_poj19

    《POJ 1990:树状数组解题策略详解》 在编程竞赛的世界里,POJ(Programming Online Judge)是一个备受瞩目的在线评测系统,它提供了丰富的编程题目供参赛者挑战。其中,编号为1990的题目是一道涉及数据结构与算法...

    字典树练习 POJ 1056

    标题中的“字典树练习 POJ 1056”是指一个编程问题,源自编程竞赛网站POJ(Programming Online Judge)的题目1056。POJ是一个在线平台,程序员可以在这里提交代码并测试其正确性,以解决给定的问题。这类问题通常...

    POJ3468.zip_poj3468

    树状数组的核心思想是将一个一维数组转化为一棵完全二叉树,但不同于普通的二叉树,它的节点存储的是子数组的累加值。这样,我们可以通过二分查找的方式快速定位到某个区间的累加和,或者在某个位置插入或删除元素时...

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

    3. 最小树形图(poj3164) 4. 次小生成树 5. 无向图、有向图的最小环 三、数据结构 1. RMQ(poj3264, poj3368) 2. 并查集的高级应用(poj1703, poj2492) 3. KMP 算法(poj1961, poj2406) 4. 左偏树(可合并堆)...

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

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

    线段树练习POJ 3264

    线段树的基本思想是将数组或序列分成多个部分(通常是二分),每个部分对应线段树的一个节点,通过节点间的合并操作,快速获取区间信息。 线段树的构建通常分为两个阶段:初始化和构造。初始化时,我们将原始数组中...

    晒代码之二——多重背包(POJ1276)

    晒代码之二——多重背包(POJ1276)

Global site tag (gtag.js) - Google Analytics