首页 > 其他 > 详细

nyoj_116_士兵杀敌(二)_201404131107

时间:2014-04-13 13:11:08      阅读:446      评论:0      收藏:0      [点我收藏+]

 

士兵杀敌(二)

时间限制:1000 ms  |  内存限制:65535 KB
难度:5
 
描述

南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的。

小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧。

南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数。

 
输入
只有一组测试数据
第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000),M表示指令的条数。(1<M<100000)
随后的一行是N个整数,ai表示第i号士兵杀敌数目。(0<=ai<=100)
随后的M行每行是一条指令,这条指令包含了一个字符串和两个整数,首先是一个字符串,如果是字符串QUERY则表示南将军进行了查询操作,后面的两个整数m,n,表示查询的起始与终止士兵编号;如果是字符串ADD则后面跟的两个整数I,A(1<=I<=N,1<=A<=100),表示第I个士兵新增杀敌数为A.
输出
对于每次查询,输出一个整数R表示第m号士兵到第n号士兵的总杀敌数,每组输出占一行
样例输入
5 6
1 2 3 4 5
QUERY 1 3
ADD 1 2
QUERY 1 3
ADD 2 3
QUERY 1 2
QUERY 1 5
样例输出
6
8
8
20
来源
[张云聪]原创
上传者
张云聪
 
bubuko.com,布布扣
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int c[1000010],n;
 5 
 6 int lowbit(int n)
 7 {
 8     return n&(-n);
 9 }
10 
11 void add(int i,int t)
12 {
13     while(i<=n)
14     {
15         c[i]+=t;
16         i+=lowbit(i);
17     }
18 }
19 
20 int sum(int n)
21 {
22     int s=0;
23     while(n>0)
24     {
25         s+=c[n];
26         n-=lowbit(n);
27     }
28     return s;
29 }
30 
31 int main()
32 {
33     int i,j,a,t1,t2,m;
34     char s[10];
35     memset(c,0,sizeof(c));
36     scanf("%d %d",&n,&m);
37     for(i=1;i<=n;i++)
38     {
39         scanf("%d",&a);
40         add(i,a);
41     }
42     for(j=1;j<=m;j++)
43     {
44         scanf("%s%d%d",s,&t1,&t2);
45         if(s[0]==A)
46         add(t1,t2);
47         else
48         printf("%d\n",sum(t2)-sum(t1-1));
49     }
50     return 0;
51 }
52 //树状数组 --插点取线
bubuko.com,布布扣

 

 

nyoj_116_士兵杀敌(二)_201404131107,布布扣,bubuko.com

nyoj_116_士兵杀敌(二)_201404131107

原文:http://www.cnblogs.com/xl1027515989/p/3661958.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!