思路:
模板题,主要注意输出格式, Case i:要在命令输入前先输出。
树状数组:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 50100;
int n,tree[maxn];
int lowbit(int x){
return x&(-x);
}
int getsum(int pos){
int res = 0;
while(pos>0){
res += tree[pos];
pos -= lowbit(pos);
}
return res;
}
void add(int pos,int num){
while(pos <= n){
tree[pos] += num;
pos += lowbit(pos);
}
}
int main(){
int T,_ = 1;
scanf("%d",&T);
while(T--){
int i,tem,t1,t2;
char Q[10];
scanf("%d",&n);
memset(tree,0,sizeof(tree));
for(i=1 ;i<=n ;i++){
scanf("%d",&tem);
add(i,tem);
}
printf("Case %d:\n",_++);
while(1){
scanf("%s",Q);
if(!strcmp(Q,"End"))
break;
scanf("%d%d",&t1,&t2);
if(!strcmp(Q,"Query")){
printf("%d\n",getsum(t2) - getsum(t1-1));
}
else if(!strcmp(Q,"Add")){
add(t1,t2);
}
else{
add(t1,-t2);
}
}
}
return 0;
}
线段树:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 50010;
struct P{
int l,r,sum;
}tree[maxn*4];
int a[maxn];
void push_up(int id){
tree[id].sum = tree[id<<1].sum + tree[id<<1|1].sum;
}
void creatTree(int id,int l,int r){
tree[id].l = l,tree[id].r = r;
tree[id].sum = 0;
if(l == r)
tree[id].sum = a[l];
else{
int mid = (l+r)>>1;
creatTree(id<<1,l,mid);
creatTree(id<<1|1,mid+1,r);
push_up(id);
}
}
void update(int id,int pos,int val){
int l = tree[id].l,r = tree[id].r;
if(l == r){
tree[id].sum += val;
}
else{
int mid = (l+r)>>1;
if(pos<=mid) update(id<<1,pos,val);
else update(id<<1|1,pos,val);
push_up(id);
}
}
int findTree(int id,int st,int ed){
int l = tree[id].l,r = tree[id].r;
if(st<=l&&r<=ed){
return tree[id].sum;
}
else{
int mid = (l+r)>>1;
ll sum1=0,sum2=0;
if(st<=mid) sum1 = findTree(id<<1,st,ed);
if(ed>mid) sum2 = findTree(id<<1|1,st,ed);
return sum1+sum2;
}
}
int main(){
int T,_=1;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
creatTree(1,1,n);
printf("Case %d:\n",_++);
char str[55];
while(scanf("%s",&str)){
if(str[0] == 'E')
break;
else if(str[0] == 'A'){
int pos,val;
scanf("%d%d",&pos,&val);
update(1,pos,val);
}
else if(str[0] == 'S'){
int pos,val;
scanf("%d%d",&pos,&val);
update(1,pos,-val);
}
else if(str[0] == 'Q'){
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",findTree(1,l,r));
}
}
}
return 0;
}