zoukankan      html  css  js  c++  java
  • NYOJ116 士兵杀敌(二) 树状数组插点问线

     

    士兵杀敌(二)

    时间限制: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
     1 /* 功能Function Description:  NYOJ-116 士兵杀敌二   
     2    开发环境Environment:       DEV C++ 4.9.9.1
     3    技术特点Technique:
     4    版本Version:
     5    作者Author:                可笑痴狂
     6    日期Date:                  20120726
     7    备注Notes:                 树状数组
     8 */
     9 
    10 #include<stdio.h>
    11 #include<malloc.h>
    12 #include<string.h>
    13 int n,num[1000001];
    14 
    15 int lowbit(int i)
    16 {
    17     return i&(-i);
    18 }
    19 
    20 void update(int i,int t)
    21 {
    22     while(i<=n)
    23     {
    24         num[i]+=t;
    25         i+=lowbit(i);
    26     }
    27 }
    28 
    29 int getsum(int i)
    30 {
    31     long sum=0;
    32     while(i>0)
    33     {
    34         sum+=num[i];
    35         i-=lowbit(i);
    36     }
    37     return sum;
    38 }
    39 
    40 int main()
    41 {
    42     int m,i,t,a,b;
    43     char str[10];
    44     memset(num,0,sizeof(num));
    45     scanf("%d%d",&n,&m);
    46     for(i=1;i<=n;++i)
    47     {
    48         scanf("%d",&t);
    49         update(i,t);
    50     }
    51     for(i=0;i<m;++i)
    52     {
    53         scanf("%s",str);
    54         if(str[0]=='Q')
    55         {
    56             scanf("%d%d",&a,&b);
    57             printf("%d\n",getsum(b)-getsum(a-1));
    58             continue;
    59         }
    60         else
    61         {
    62             scanf("%d%d",&a,&b);
    63             update(a,b);
    64         }
    65     }
    66 //    system("pause");
    67     return 0;
    68 }
    功不成,身已退
  • 相关阅读:
    Eclipse / android studio 添加第三方jar包 步骤
    Android checkbox 自定义点击效果
    Android 程序打包和安装过程
    Android 基础
    (转)Genymotion安装virtual device的“unable to create virtual device, Server returned Http status code 0”的解决方法
    (转)eclipse 导入Android 项目 步骤
    微信开放平台注册 步骤
    Android Studio 初级安装
    数组
    作用域问题代码
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2610590.html
Copyright © 2011-2022 走看看