Lily特别喜欢养花,但是由于她的花特别多,所以照料这些花就变得不太容易。她把她的花依次排成一行,每盆花都有一个美观值。如果Lily把某盆花照料的好的话,这盆花的美观值就会上升,如果照料的不好的话,这盆花的美观值就会下降。有时,Lily想知道某段连续的花的美观值之和是多少,但是,Lily的算术不是很好,你能快速地告诉她结果吗?Input
第一行一个整数T,表示有T组测试数据。
每组测试数据的第一行为一个正整数N (N<=50000),表示Lily有N盆花。
接下来有N个正整数,第i个正整数ai(1<=ai<=50) 表示第i盆花的初始美观值。
接下来每行有一条命令,命令有4种形式:
(1)Add i j, i和j为正整数,表示第i盆花被照料的好,美观值增加j (j<=30)
(2)Sub i j, i和j为正整数,表示第i盆花被照料的不好,美观值减少j (j<=30)
(3)Query i j, i和j为正整数,i<=j,表示询问第i盆花到第j盆花的美观值之和
(4)End,表示结束,这条命令在每组数据最后出现
每组数据的命令不超过40000条
Output
对于第i组数据,首先输出"Case i:"和回车。
对于每个"Query i j"命令,输出第i盆花到第j盆花的美观值之和。
Sample Input
1
9
7 9 8 4 4 5 4 2 7
Query 7 9
Add 4 9
Query 3 6
Sub 9 6
Sub 3 3
Query 1 9
End
Sample Output
Case 1: 13 30 50
解题思路:线段树模板题;
1 #include<iostream>
2 #include <string.h>
3 #include <stdio.h>
4 #include <queue>
5
6 using namespace std;
7
8 const int MAX = 50000*2 + 5000;
9 const long long MAX1 = 1e10;
10
11 struct Seg
12 {
13 int veg;
14 }seg[MAX];
15
16 void CJ(int root,int add[],int istact,int iend)
17 {
18 if(istact == iend)
19 {
20 seg[root].veg = add[iend];
21
22 }
23
24 else
25 {
26 int mid = (istact + iend)/2;
27 CJ(root*2+1,add,istact,mid);
28 CJ(root*2+2,add,mid+1,iend);
29 seg[root].veg = seg[root*2+1].veg + seg[root*2+2].veg;
30 }
31 }
32
33 int Cha(int root,int istact,int iend,int nstact,int nend)
34 {
35 if(nstact > iend || nend < istact )
36 return 0;
37 if(nstact <= istact&&nend >=iend )
38 return seg[root].veg;
39 int mid = (istact + iend)/2;
40 int temp1 =Cha(root*2+1,istact,mid,nstact,nend);
41 int temp2 = Cha(root*2+2,mid+1,iend,nstact,nend);
42 return temp1 +temp2;
43
44 }
45
46 void gaibian(int root,int istact,int iend,int wei,int agg)
47 {
48 if(istact == iend)
49 {
50 if(iend == wei)
51 seg[root].veg +=agg;
52 return;
53 }
54 int mid = (istact + iend)/2;
55 if(wei <=mid )
56 gaibian(root*2+1,istact,mid,wei,agg);
57 else
58 gaibian(root*2+2,mid+1,iend,wei,agg);
59 seg[root].veg = seg[root*2+1].veg + seg[root*2+2].veg;
60 }
61
62 int a[MAX];
63 int T;
64 int N;
65 int main()
66 {
67 cin>>T;
68 int t = 0;
69 while(T--)
70 {
71 cout<<"Case "<<++t<<":"<<endl;
72
73 cin>>N;
74 for(int i =1;i <=N;i++)
75 scanf("%d",&a[i]);
76 CJ(0,a,1,N);
77
78 char zhi[20];
79 while(scanf("%s",zhi))
80 {
81 if(zhi[0]=='E') break;
82 int x,y;
83 scanf("%d %d",&x,&y);
84 if(zhi[0]=='Q')
85 {
86 cout<<Cha(0,1,N,x,y)<<endl;
87 }
88 else if(zhi[0]=='A')
89 {
90 gaibian(0,1,N,x,y);
91 }
92 else if(zhi[0]=='S')
93 {
94 gaibian(0,1,N,x,-y);
95 }
96
97 }
98 }
99
100 return 0;
101 }