548人阅读 评论(0)

﻿﻿

# 敌兵布阵

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
Query 2 7
Sub 10 2
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;
}


0
0

个人资料
• 访问：310959次
• 积分：5902
• 等级：
• 排名：第5172名
• 原创：273篇
• 转载：8篇
• 译文：0篇
• 评论：45条
友情链接
最新评论