NYOJ【士兵杀敌(二)】
生活随笔
收集整理的這篇文章主要介紹了
NYOJ【士兵杀敌(二)】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
士兵殺敵(二)
時間限制:1000?ms ?|? 內存限制:65535?KB難度:5 描述南將軍手下有N個士兵,分別編號1到N,這些士兵的殺敵數都是已知的。
小工是南將軍手下的軍師,南將軍經常想知道第m號到第n號士兵的總殺敵數,請你幫助小工來回答南將軍吧。
南將軍的某次詢問之后士兵i可能又殺敵q人,之后南將軍再詢問的時候,需要考慮到新增的殺敵數。
輸入第一行是兩個整數N,M,其中N表示士兵的個數(1<N<1000000),M表示指令的條數。(1<M<100000)
隨后的一行是N個整數,ai表示第i號士兵殺敵數目。(0<=ai<=100)
隨后的M行每行是一條指令,這條指令包含了一個字符串和兩個整數,首先是一個字符串,如果是字符串QUERY則表示南將軍進行了查詢操作,后面的兩個整數m,n,表示查詢的起始與終止士兵編號;如果是字符串ADD則后面跟的兩個整數I,A(1<=I<=N,1<=A<=100),表示第I個士兵新增殺敵數為A.
解法一:
樹狀數組
#include<bits/stdc++.h> using namespace std; int N,M,c[1000005]; int lowbit(int i) {return i&(-i);} void add(int i,int value) {while(i<=N){c[i]+=value;i+=lowbit(i);} } int sum(int i){int sum=0;while(i>0){sum+=c[i];i-=lowbit(i);}return sum; } int main() {ios::sync_with_stdio(false);fill(c,c+1000005,0);cin>>N>>M;int a,b;string op;for(int i=1;i<=N;i++){cin>>a;add(i,a);}while(M--){cin>>op>>a>>b;if(op[0]=='A'){add(a,b);}else{cout<<sum(b)-sum(a-1)<<endl;}}return 0;}解法二:
線段樹,更新點,查詢區間求和
總結
以上是生活随笔為你收集整理的NYOJ【士兵杀敌(二)】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HDU 1556 前缀和 树状数组 线段
- 下一篇: poj 1664 放苹果 DPDFS