树状数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 |
#include <cstdio> #include <cstring> using
namespace std; const
int N=50010; int T,n,cnt=1,x,y; char
s[6]; int c[N]; void
init(){ for ( int
i=0;i<N;i++)c[i]=0;} void
add( int
x, int num){ while (x<=n)c[x]+=num,x+=x&-x;} int
sum( int
x){ int
s=0; while (x>0)s+=c[x],x-=x&-x; return
s;} int
main(){ scanf ( "%d" ,&T); while (T--){ init(); scanf ( "%d" ,&n); for ( int
i=1;i<=n;i++){ scanf ( "%d" ,&x);add(i,x);} printf ( "Case %d:\n" ,cnt++); while ( scanf ( "%s" ,s), strcmp (s, "End" )){ scanf ( "%d%d" ,&x,&y); if ( strcmp (s, "Add" )==0)add(x,y); else
if ( strcmp (s, "Sub" )==0)add(x,-y); else
printf ( "%d\n" ,sum(y)-sum(x-1)); } } return
0; } |
线段树
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 |
#include <cstdio> #include <cstring> const
int N=60000; int T,n,cnt=1,x,y,sum[N<<2]; char
s[6]; void
init(){ for ( int
i=1;i<N*4;i++)sum[i]=0;} void
up( int
x){sum[x]=sum[x<<1]+sum[x<<1|1];} void
build( int
l, int r, int x){ if (l==r){ scanf ( "%d" ,&sum[x]); return ;} int
mid=(l+r)>>1; build(l,mid,x<<1); build(mid+1,r,x<<1|1); up(x); //注意不要漏写 } void
update( int
t, int num, int
l, int r, int x){ if (l==r){sum[x]+=num; return ;} int
mid=(l+r)>>1; if (t<=mid)update(t,num,l,mid,x<<1); else
update(t,num,mid+1,r,x<<1|1); up(x); //同上 } int
query( int
L, int R, int l, int r, int x){ if (L<=l&&r<=R){ return
sum[x];} int
mid=(l+r)>>1,tmp=0; if (L<=mid)tmp+=query(L,R,l,mid,x<<1); if (R>mid)tmp+=query(L,R,mid+1,r,x<<1|1); return
tmp; } int
main(){ scanf ( "%d" ,&T); while (T--){ init(); printf ( "Case %d:\n" ,cnt++); scanf ( "%d" ,&n); build(1,n,1); while ( scanf ( "%s" ,s), strcmp (s, "End" )){ scanf ( "%d%d" ,&x,&y); if ( strcmp (s, "Add" )==0)update(x,y,1,n,1); else
if ( strcmp (s, "Sub" )==0)update(x,-y,1,n,1); else
printf ( "%d\n" ,query(x,y,1,n,1)); } } return
0; } |
原文:http://www.cnblogs.com/forever97/p/3567504.html