﻿﻿

# 敌兵布阵

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 55473    Accepted Submission(s): 23265

Problem Description
C国的死对头A国这段时间正在进行军事演习，所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段，所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动，可能增加或减少若干人手,但这些都逃不过C国的监视。

Input

(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人（j不超过30）;
(3)Query i j ,i和j为正整数,i<=j，表示询问第i到第j个营地的总人数;
(4)End 表示结束，这条命令在每组数据最后出现;

Output

Sample Input
1 10 1 2 3 4 5 6 7 8 9 10 Query 1 3 Add 3 6 Query 2 7 Sub 10 2 Add 6 3 Query 3 10 End

Sample Output
Case 1: 6 33 59

#include <map>
#include <cmath>
#include <vector>
#include <cstdio>
#include <string>
#include <sstream>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 50000+5;
int N,a,b,TreeArr[maxn];
int lowbit(int x) { return x&(x^(x-1));}
int Query(int n) {
//Sum(n) = A1+A2+...+An = Cn+C[n-lowbit(n)]+...
int sum = 0;
while(n>0) {
sum+=TreeArr[n];
n-=lowbit(n);
}
return sum;
}
while(pos<=N) {
pos+=lowbit(pos);
}
}
int main() {
//   freopen("input.in","r",stdin);
int t,cas=0;char Opr[10];
scanf("%d",&t);
while(t--) {
printf("Case %d:\n",++cas);
memset(TreeArr,0,sizeof(TreeArr));
scanf("%d",&N);
for(int i = 1;i <= N;i++) {
scanf("%d",&a);
Modify(i,a);
}
while(scanf("%s",Opr)) {
if(Opr[0]=='E') break;
scanf("%d %d",&a,&b);
if(Opr[0]=='Q') {
printf("%d\n",Query(b)-Query(a-1));
continue;
}
if(Opr[0]=='S') {
Modify(a,-b);
continue;
}
if(Opr[0]=='A') {
Modify(a,b);
continue;
}
}
}
return 0;
}


#include <iostream>
#include <cstdio>
using namespace std;
const int M = 50005;
int sum[M<<2];
void PushUp(int cur){
sum[cur] = sum[cur<<1]+sum[(cur<<1)+1];
}
void build(int l,int r,int cur){
if(l == r){
scanf("%d",&sum[cur]);
return;
}
int mid = (l+r)>>1;
build(l,mid,cur<<1);
build(mid+1,r,(cur<<1)+1);
PushUp(cur);
}
int query(int a,int b,int l,int r,int cur){
if(a <= l&&b >= r){
return sum[cur];
}
int mid = (l+r)>>1;
int res = 0;
if(a <= mid)    res += query(a,b,l,mid,cur<<1);
if(b > mid )    res += query(a,b,mid + 1,r,(cur<<1)+1);
return res;
}
void update(int a,int add,int l,int r,int cur){
if(l == r){
return ;
}
int mid = (l+r)>>1;
PushUp(cur);
}
int main(){
int t,n,a,b;
char s[10];
cin>>t;
for(int i = 1;i <= t;i++){
cin>>n;
build(1,n,1);
getchar();
printf("Case %d:\n",i);
while(1){
scanf("%s",s);
if(s[0] == 'E') break;
scanf("%d%d",&a,&b);
if(s[0] == 'Q'){
printf("%d\n",query(a,b,1,n,1));
}
else{
if(s[0] == 'S') b = (-1)*b;
update(a,b,1,n,1);
}
}
}
return 0;
}


#### HDU 1166 敌兵布阵(线段树or树状数组)

2017-09-07 23:59:02

#### hdu 1166 敌兵布阵（线段树 or 树状数组）

2016-06-15 22:19:57

#### HDU 1166 —— 敌兵布阵 【树状数组 or 线段树】

2016-05-18 21:38:17

#### HDU 1166 敌兵布阵(线段树 or 树状数组)

2015-10-06 12:07:25

#### HDU1166 敌兵布阵【树状数组 OR 线段树】

2014-08-13 09:43:05

#### hdu1166 敌兵布阵（线段树）

2015-12-11 11:07:13

#### HDU-1166-敌兵布阵(树状数组)

2012-07-22 07:57:14

#### HDU-1166-敌兵布阵-单点更新

2015-07-15 18:50:29

#### hdu1166 敌兵布阵 线段树 点更新

2016-08-18 23:29:26

#### 杭电1166敌兵布阵（线段树）

2015-08-20 20:34:47