POJ 1195 树状数组 JAVA版

这个题是比较基础的树状数组的题目了,但是鉴于还是小白,而且为了一些跟我一样的学java的小白,还是把对这个题目的理解写的透一点吧。

题目的大意就是让你求一个S*S的表格中一些格子里所包含的手机个数的和。

输入:

输入0的时候,后面的数S就是所建立表格的大小S*S【用二维数组表示】;输入1的时候,在(X,Y)格中加入A个手机;输入2的时候,计算从(L,B)到(R,T)的所有格子的手机的总数,并且输出;输入3的时候,结束程序。

AC代码如下【小白必然代码不优雅】

import java.util.*;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scan=new Scanner(System.in);
		int n=scan.nextInt();
		int s=scan.nextInt();
		int C[][]=new int [s+1][s+1];
		while(n!=3)
		{
			if(n==1)
		    { int X=scan.nextInt()+1;
		      int Y=scan.nextInt()+1;
		      int A=scan.nextInt();
		      Change(Y,X,A,C);
		      
		    }
			 if(n==2)
			    { int L=scan.nextInt()+1;
			      int B=scan.nextInt()+1;
			      int R=scan.nextInt()+1;
			      int T=scan.nextInt()+1;
			      int sum=Sum(T,R,C)-Sum(T,L-1,C)-Sum(B-1,R,C)+Sum(B-1,L-1,C);
				  System.out.println(sum);
			    }
			    n=scan.nextInt();


		}
	}
	
	public static int lowbit(int l)
	   { 
		return l&(-l);
	   }
	   public static int Sum(int Y,int X,int[][] C)
	   {  int sum=0;
	   for(int y=Y;y>0;y-=lowbit(y))
		   for(int x=X;x>0;x-=lowbit(x))
			   sum+=C[y][x];
		  return sum;
	   }
	   public static void Change(int Y,int X,int A,int[][] C)
	   {  
	       int length=C.length;
	       for(int y=Y;y<length;y+=lowbit(y))
	    	   for(int x=X;x<length;x+=lowbit(x))
	    		   C[y][x]+=A;
	   }
	}


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值