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

HDU 1166 敵兵布陣 樹狀數組||線段樹

編輯:C++入門知識

 

題目大意:

給定n個數的區間N<=50000,還有Q個詢問(Q<=40000)求區間和。

每個詢問可能增加點k x的值或者減少x。

思路:

原題描述很有愛啊~

樹狀數組好久沒寫了~

依舊很熟練,WA了兩三次,第一次因為沒有輸出case,。。。。。。。第二次發現多組數據沒有初始化。T^T

~像這種單點修改求區間和的還是用樹狀數組比較簡單~

樹狀數組:

 

#include
#include
const int MAXN=50000+10;
int sum[MAXN];
inline int lowbit(int x)
{
	return x&-x;
}

int getsum(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=sum[x];
		x-=lowbit(x);
	}
	return ans;
}

void add(int x,int v)
{
	while(x

線段樹:

 

#include
#include
const int MAXN=50000+10;
int sum[MAXN<<2],a[MAXN];
void build(int k,int L,int R)  
{  
    if(L==R)  sum[k]=a[L];  
    else  
    {  
        int m=(L+R)/2;  
        build(k*2,L,m);  
        build(k*2+1,m+1,R);  
        sum[k]= sum[k*2]+sum[k*2+1];
    }  
}  

int getsum(int k,int L,int R,int a,int b) 
{  
    int m=(L+R)/2,ans=0;  
    if(a<=L && R<=b) return sum[k];  
    if(a<=m) ans+=getsum(k*2,L,m,a,b);  
    if(m

 

 

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