zoukankan      html  css  js  c++  java
  • hdu 1116 敌兵布阵(树状数组区间求和)

    题意:

    给出一行数字,然后可以修改其中第i个数字,并且可以询问第i至第j个数字的和(i <= j)。

    输入:

    首行输入一个t,表示共有t组数据。

    接下来每行首行输入一个整数n,表示共有n个数字。

    接下来每行首先输入一个字符串,如果是”Add”,接下来是两个整数ab,表示给第i个数增加b。如果是”Query”,接下来是两个整数ab,表示查询从第i个数到第j个数之间的和。如果是”End”,表示这组数据结束。

    输出:

    每组数据首先输出”Case X: ”,其中X表示第x组数。

    每次查询,输出计算结果,每个结果占一行。

    题解:

    点修改与区间求和,可以用树状数组模板。

    具体见代码——

     1 #include <cstdio>
     2 #include <cmath>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 
     7 const int N = 50005;
     8 
     9 int t, n;
    10 int a[N];
    11 int c[N];
    12 char s[10];
    13 int x, y;
    14 
    15 int lowbit(int x)
    16 {
    17     return x&(-x);
    18 }
    19 
    20 void Add(int x, int y)
    21 {
    22     a[x] += y;
    23     while(x <= n)
    24     {
    25         c[x] += y;
    26         x += lowbit(x);
    27     }
    28 }
    29 
    30 int Sum(int x)
    31 {
    32     int rt = 0;
    33     while(x > 0)
    34     {
    35         rt += c[x];
    36         x -= lowbit(x);
    37     }
    38     return rt;
    39 }
    40 
    41 int Summ(int l, int r)
    42 {
    43     int rt = 0;
    44     while(r >= l)
    45     {
    46         if(r-lowbit(r) < l)
    47         {
    48             rt += a[r];
    49             r -= 1;
    50         }
    51         else
    52         {
    53             rt += c[r];
    54             r -= lowbit(r);
    55         }
    56     }
    57     return rt;
    58 }
    59 
    60 void Query(int a, int b)
    61 {
    62     printf("%d
    ", Sum(b)-Sum(a-1));
    63     //printf("%d
    ", Summ(a, b));
    64 }
    65 
    66 int main()
    67 {
    68     //freopen("test.in", "r", stdin);
    69     scanf("%d", &t);
    70     for(int tm = 1; tm <= t; tm++)
    71     {
    72         scanf("%d", &n);
    73         memset(c, 0, sizeof(c));
    74         memset(a, 0, sizeof(a));
    75         int y;
    76         for(int i = 1; i <= n; i++)
    77         {
    78             scanf("%d", &y);
    79             Add(i, y);
    80         }
    81         printf("Case %d:
    ", tm);
    82 
    83         scanf("%s", s);
    84         while(s[0] != 'E')
    85         {
    86             scanf("%d%d", &x, &y);
    87             if(s[0] == 'A') Add(x, y);
    88             if(s[0] == 'Q') Query(x, y);
    89             if(s[0] == 'S') Add(x, -y);
    90             scanf("%s", s);
    91         }
    92     }
    93 }
    View Code

    树状数组区间求和模板——

    http://www.cnblogs.com/mypride/p/5001858.html

  • 相关阅读:
    Java实现串口通信的小样例
    poi读写Excel
    java的list类
    java集合类
    常用正则表达式
    正则表达式
    Java获取路径中的文件名(正则表达式)
    poi读取word2003(.doc文档)中的表格
    使用poi读取word2007(.docx)中的复杂表格
    使用Maven搭建SpringMVC
  • 原文地址:https://www.cnblogs.com/mypride/p/5001864.html
Copyright © 2011-2022 走看看