程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj 1195 Mobile phones(樹狀數組)

poj 1195 Mobile phones(樹狀數組)

編輯:C++入門知識

poj 1195 Mobile phones(樹狀數組)


裸樹狀數組,關鍵在於二維的求和操作不要寫錯。

getsum(u+1,v+1)+getsum(x,y)-getsum(u+1,y)-getsum(x,v+1);



#include
#include 
#include
#include
#include 
#include
#include
using namespace std;
#define N 1050
int n,m;
int tt[N][N];

int lowbit(int x){return -x&x;}
void update(int r,int l,int num)
{
	int i,j;
	for(i=r;i<=n;i+=lowbit(i))
		for(j=l;j<=n;j+=lowbit(j))
		tt[i][j]+=num;

}
int getsum(int r,int l)
{
	int i,j;
	int ans=0;
	for(i=r;i>0;i-=lowbit(i))
		for(j=l;j>0;j-=lowbit(j))
		ans+=tt[i][j];
	return ans;
}

int main()
{
	int i,j,k,u,v,x,y;
	//freopen("in.txt","r",stdin);
	while(1)
	{
		scanf("%d",&k);
		if(k==0){scanf("%d",&n);n++;memset(tt,0,sizeof(tt));continue;}
		
		else if(k==1){scanf("%d%d%d",&x,&y,&u);update(x+1,y+1,u);continue;}
		else if(k==2)
		{
			scanf("%d%d%d%d",&x,&y,&u,&v);
			k=getsum(u+1,v+1)+getsum(x,y)-getsum(u+1,y)-getsum(x,v+1);
			printf("%d\n",k);
		}
		else
			break;
	}
	return 0;
}


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved