一道简单的树状数组,但是存在坑爹的问题。。。是我自己的问题。。。。。。~~~~(>_<)~~~~
首先说一下输出,输出案例,是在输入那些阵营的人数之后在输出(再次表示不满,acm就一定要有案例输出吗,这个问题输出错了竟然判wa,害人不浅,我根本就没有想到这里会出错,浪费精力。。。~~~~(>_<)~~~~ )
第二,我判别了一下人数删除时是否符合要删除的数量时就错了。。。。。。有问题吗?难道你要别人减去的人比本来的人数还要多。。。。。。你很喜欢负债吗?(~ o ~)~zZ
View Code
1 #include <cstdio>
2 #include <cstring>
3
4 int per[50010];
5 int vis[50010];
6 int n;
7
8 void insert(int t,int num)
9 {
10 for(int i = t;i <= n; i += (i&(-i)))
11 {
12 per[i] += num;
13 }
14 }
15
16 int getsum(int t)
17 {
18 int sum = 0;
19 for(int i = t; i > 0;i -= (i&(-i)))
20 {
21 sum += per[i];
22 }
23
24 return sum;
25 }
26
27 void init()
28 {
29 for(int i =1;i <= n;i ++)
30 {
31 insert(i,vis[i]);
32 }
33 }
34
35 int main()
36 {
37 int T,cas = 1;
38 scanf("%d",&T);
39 while(T--)
40 {
41 scanf("%d",&n);
42 memset(per,0,sizeof(per));
43 for(int i = 1;i <= n;i ++)
44 scanf("%d",&vis[i]);
45
46 init();
47 printf("Case %d:\n",cas ++);//!
48 char s[7];
49 while(scanf("%s",s) == 1)
50 {
51 if(!strcmp(s,"End"))
52 break;
53 int a,b;
54 scanf("%d%d",&a,&b);
55 if(!strcmp(s,"Query"))
56 {
57 printf("%d\n",getsum(b) - getsum(a-1));
58 }
59 else if(!strcmp(s,"Add"))
60 {
61 insert(a,b);
62 }
63 else if(!strcmp(s,"Sub"))
64 {
65 /*int num = getsum(a) - getsum(a-1);
66 if(num < b)
67 b = num;*/
68 insert(a,-b);
69 }
70 }
71 }
72
73 return 0;
74 }
那个注释的地方到底是为什么啊,真的要减去比原来人数还要多的人吗?求解啊~~~~