HDOJ 1166 敌兵布阵(超裸树状数组)

来源:互联网 发布:高考网络应用平台 编辑:程序博客网 时间:2024/05/29 13:51

题意:裸树状数组,点更新区间查询

第一道树状数组,写的很详细

#include <bits/stdc++.h>using namespace std;const int maxn = 51000;int arr[maxn];int tree[maxn];int n;int lowbit(int x){    return x & -x;}void update(int pos, int delta){    while (pos <= n) {        tree[pos] += delta;        pos += lowbit(pos);    }}int query(int pos){    if (pos == 0)        return 0;    int ret = 0;    while (pos) {        ret += tree[pos];        pos -= lowbit(pos);    }    return ret;}enum CMD_TYPE{CMD_QUERY, CMD_ADD, CMD_SUB, CMD_END};int get_cmd(){    int ret;    char cmd_str[10];    scanf("%s", cmd_str);    switch (cmd_str[0]) {    case 'Q':        ret = CMD_QUERY;        break;    case 'S':        ret = CMD_SUB;        break;    case 'A':        ret = CMD_ADD;        break;    default:        ret = CMD_END;        break;    }    return ret;}void do_query(){    int fr, to;    scanf("%d%d", &fr, &to);    printf("%d\n", query(to) - query(fr-1));}void do_add(){    int pos, delta;    scanf("%d%d", &pos, &delta);    update(pos, delta);}void do_sub(){    int pos, delta;    scanf("%d%d", &pos, &delta);    update(pos, -delta);}int main(){    int T;    scanf("%d", &T);    for (int ca = 1; ca <= T; ca++) {        printf("Case %d:\n", ca);        scanf("%d", &n);        memset(tree, 0, sizeof(tree));        for (int i = 1; i <= n; i++) {            scanf("%d", &arr[i]);            update(i, arr[i]);        }        int cmd;        while ((cmd = get_cmd()) != CMD_END) {            switch (cmd) {            case CMD_QUERY:                do_query();                break;            case CMD_ADD:                do_add();                break;            case CMD_SUB:                do_sub();                break;            default:                break;            }        }    }    return 0;}


0 0
原创粉丝点击