zoukankan      html  css  js  c++  java
  • 【HDU1166】敌兵布阵(树状数组或线段树)

    是一道树状数组的裸题,也可以说是线段树的对于单点维护的裸题。多做这种题目可以提高自己对基础知识的理解程度,很经典。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdlib>
     4 #include <cstdio>
     5 #include <numeric>
     6 #include <algorithm>
     7 #include <cmath>
     8 #include <cctype>
     9 #include <string>
    10 using namespace std;
    11 
    12 
    13 const int N = 50005;
    14 int C[N];
    15 
    16 struct peo {
    17     int x, v;
    18 }P[N];
    19 
    20 int lowbit (int x) {
    21     return x & -x;
    22 }
    23 
    24 int sum (int x) {
    25     int ret = 0;
    26     while (x > 0) {
    27         ret += C[x]; x -= lowbit(x);
    28     }
    29     return ret;
    30 }
    31 
    32 void add (int x, int d) {
    33     while (x <= 50000) {
    34         C[x] += d; x += lowbit(x);
    35     }
    36 }
    37 
    38 int _sum (int d, int u) {
    39     return sum(u) - sum(d - 1);
    40 }
    41 
    42 int main () {
    43     int T, n, cur = 0; scanf("%d", &T);
    44     char op[10];
    45     while (T --) {
    46         memset(C, 0, sizeof(C));
    47         memset(P, 0, sizeof(P));
    48         scanf("%d", &n);
    49         for (int i = 0 ; i < n; ++ i) {
    50             scanf("%d", &P[i].v);
    51             P[i].x = i + 1;
    52             add (P[i].x, P[i].v);
    53         }
    54         //cout << sum(3) << endl;
    55         printf("Case %d:
    ", ++ cur);
    56         while (scanf("%s", op)) {
    57             if (op[0] == 'E') {
    58                 break;
    59             } else if (op[0] == 'Q') {
    60                 int x, y;
    61                 scanf("%d %d", &x, &y);
    62                 cout << _sum(x, y) << endl;
    63             } else if (op[0] == 'S') {
    64                 int x, y;
    65                 scanf("%d %d", &x, &y);
    66                 add (x, -y);
    67             } else if (op[0] == 'A') {
    68                 int x, y;
    69                 scanf("%d %d", &x, &y);
    70                 add (x, y);
    71             }
    72         }
    73     }
    74     return 0;
    75 }
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <vector>
     5 #include <cstring>
     6 #include <cstdlib>
     7 #include <cctype>
     8 #include <algorithm>
     9 #include <numeric>
    10 
    11 using namespace std;
    12 
    13 struct P{
    14     int sum, l, r;
    15 } node[150050];
    16 
    17 int n, num[50050] = {0};
    18 
    19 void build (int k, int l, int r) {
    20     node[k].l = l, node[k].r = r;
    21     if (l == r) {
    22         node[k].sum = num[l];
    23     } else {
    24         build(2 * k, l, (l + r) / 2);
    25         build(2 * k + 1, ((l + r) / 2) + 1, r);
    26         node[k].sum = node[2 * k].sum + node[2 * k + 1].sum;
    27     }
    28 }
    29 
    30 void update(int k, int i, int x) {
    31     if (node[k].l <= i && node[k].r >= i) {
    32         node[k].sum += x;
    33     }
    34     if (node[k].l == node[k].r) {
    35         return ;
    36     }
    37     if (i <= node[2 * k].r) {
    38         update(2 * k, i, x);
    39     }
    40     else update(2 * k + 1, i, x);
    41 }
    42 
    43 int query (int k, int l, int r) {
    44     if (l == node[k].l && r == node[k].r) {
    45         return node[k].sum;
    46     }
    47     if (r <= node[2 * k].r)  {
    48         return query(2 * k, l, r);
    49     }
    50     if (l >= node[2 * k + 1].l) {
    51         return query(2 * k + 1, l, r);
    52     } else {
    53         return query(2 * k, l, node[2 * k].r) + query(2 * k + 1, node[2 * k + 1].l, r);
    54     }
    55 }
    56 
    57 int main(){
    58     int T;
    59     scanf("%d",&T);
    60     for (int z = 1; z <= T; ++ z) {
    61         memset(num, 0, sizeof(num));
    62         scanf("%d", &n);
    63         for (int i = 1; i <= n; ++ i) {
    64             scanf("%d",&num[i]);
    65         }
    66         build(1, 1, n);
    67         char s[100];
    68         printf("Case %d:
    ",z);
    69         while (scanf("%s", s)){
    70             if (s[0] == 'E')    break;
    71             if (s[0] == 'Q'){
    72                 int a, b;
    73                 scanf("%d%d" ,&a ,&b);
    74                 printf("%d
    ",query(1, a, b));
    75             }
    76             if (s[0] == 'A'){
    77                 int a,x;
    78                 scanf("%d%d", &a, &x);
    79                 update(1, a, x);
    80             }
    81             if (s[0] == 'S') {
    82                 int a,x;
    83                 scanf("%d%d", &a, &x);
    84                 update(1, a, -x);
    85             }
    86         }
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    设计tag的sql语句,支持每个tag的个数,Access数据库非msSql
    ulObj ul = new ulObj();
    Access 日期比较用 #扩住日期 代码如下
    dw中IMG标记的正则替换
    许涛的 repeater itemCommand 事件代码(经典代码,不难)
    n1视觉图片列表样式[jquery代码][A标记里面一个IMG一个EM]
    flashbox小组件开发~~开源~~
    动态读取一张图片到mc里,读取txt中的内容 flash as 全站flash专题
    简单的jQueryTab 自写的小代码
    flashCs3 按钮事件没了?原来As3已经改为监听模式了!
  • 原文地址:https://www.cnblogs.com/Destiny-Gem/p/3871028.html
Copyright © 2011-2022 走看看