時間限制:1000 ms | 記憶體限制:65535 kb
難度:5
描述南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。
小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。
南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。
輸入只有一組測試資料
第一行是兩個整數n,m,其中n表示士兵的個數(1
輸出對於每次查詢,輸出乙個整數r表示第m號士兵到第n號士兵的總殺敵數,每組輸出佔一行
樣例輸入
5 61 2 3 4 5
query 1 3
add 1 2
query 1 3
add 2 3
query 1 2
query 1 5
樣例輸出
68820
線段樹
#include int s[2097500];
int n,m;
int creat(int l,int r,int root)
int mid = (l+r)/2;
return s[root] = creat(l,mid,root*2)+creat(mid+1,r,root*2+1);
}int add(int l,int r,int root,int x,int y)
int mid = (l+r)/2;
if(x<=mid)
else
s[root]+=y;
}int sum(int l,int r,int root,int x,int y)
int mid = (l+r)/2;
return sum(l,mid,root*2,x,y)+sum(mid+1,r,root*2+1,x,y);
}int main()
else
}return 0;
}
樹狀陣列
c1 = a1
c2 = a1 + a2
c3 = a3
c4 = a1 + a2 + a3 + a4
c5 = a5
c6 = a5 + a6
c7 = a7
c8 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8
c16 = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8 + a9 + a10 + a11 + a12 + a13 + a14 + a15 + a16
設節點編號為x,那麼這個節點管轄的區間為2^k(其中k為x二進位制末尾0的個數)個元素。因為這個區間最後乙個元素必然為ax,
所以很明顯:cn = a(n – 2^k + 1) + ... + an
#include int tree[1000001];
int s[1000001];
int n,m;
int lowbit(int x)
void add(int i,int j)
}int sum(int x)
return res;
}int main()
for(i=1;i<=n;i++)
char x[10];
int a,b;
while(m--)
else
}return 0;
}
NYOJ 116 士兵殺敵(二)
時間限制 1000 ms 記憶體限制 65535 kb難度 5 描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,...
NYOJ 116 士兵殺敵 二
樹狀陣列已經看了好幾天了,一直都是半懂半不懂,實在是忍無可忍了,今天晚上又看了看劉汝佳的 似乎明白了樹狀陣列到底是怎麼回事,果斷寫篇部落格,明天要把線段樹和字典樹給搞定,不能再肉了 樹狀陣列可以很方便的查詢任意區間內所有元素的和,還可以對樹進行修改,時間複雜度位log n 有兩個很重的陣列,a n ...
nyoj 116 士兵殺敵二
描述 南將軍手下有n個士兵,分別編號1到n,這些士兵的殺敵數都是已知的。小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。南將軍的某次詢問之後士兵i可能又殺敵q人,之後南將軍再詢問的時候,需要考慮到新增的殺敵數。輸入 只有一組測試資料 第一行是兩個整數...