hdu 1166 敌兵布阵
线段树 46MS
#include <stdio.h>
#define MAXN 50005
int number[MAXN];
struct STNode
{
int l,r,num;
};
STNode node[MAXN*3];
void build(int a,int b,int idx)
{
node[idx].l=a;
node[idx].r=b;
if(a==b)
{
node[idx].num=number[a];
return;
}
int mid=(a+b)/2;
build(a,mid,idx*2);
build(mid+1,b,idx*2+1);
node[idx].num = node[idx*2].num + node[idx*2+1].num;
}
void alter(int i,int v,int idx)
{
node[idx].num+=v;
if(i==node[idx].l && i==node[idx].r) return;
if(i<=node[idx*2].r) alter(i,v,idx*2);
else alter(i,v,idx*2+1);
}
int query(int a,int b,int idx)
{
if(a<=node[idx].l && node[idx].r<=b)
{
return node[idx].num;
}
if(b<=node[idx*2].r) return query(a,b,idx*2);
else if(a>=node[idx*2+1].l) return query(a,b,idx*2+1);
else return query(a,node[idx*2].r,idx*2) + query(node[idx*2+1].l,b,idx*2+1);
}
int main()
{
int T,n,i,j,cas=1;
char oper[10];
scanf("%d",&T);
while(T--)
{
printf("Case %d:\n",cas++);
scanf("%d",&n);
for(i=1; i<=n; i++) scanf("%d",&number[i]);
build(1,n,1);
while(scanf("%s",oper))
{
if(oper[0]=='E') break;
scanf("%d %d",&i,&j);
if(oper[0]=='A')
{
alter(i,j,1);
}
else if(oper[0]=='S')
{
alter(i,-j,1);
}
else
{
printf("%d\n",query(i,j,1));
}
}
}
return 0;
}
//*****************************************************************************************************
树状数组 31MS
#include<stdio.h>
#include<string.h>
#define MAXN 50005
int n,c[MAXN];
inline int lowbit(int x)
{
return x&(-x);
}
void update(int x,int val)
{
while(x<=n)
{
c[x]+=val;
x+=lowbit(x);
}
}
int getSum(int x)
{
int s=0;
while(x>0)
{
s+=c[x];
x-=lowbit(x);
}
return s;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("tdata.txt","r",stdin);
#endif
int T,cas,i,j,t;
char str[6];
scanf("%d",&T);
for(cas=1;cas<=T;cas++)
{
memset(c,0,sizeof(c));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&t);
update(i,t);
}
printf("Case %d:\n",cas);
while(scanf("%s",str),str[0]!='E')
{
scanf("%d %d",&i,&j);
if(str[0]=='A') update(i,j);
else if(str[0]=='S') update(i,-j);
else printf("%d\n",getSum(j)-getSum(i-1));
}
}
return 0;
}
浙公网安备 33010602011771号