HDU-1166-敌兵布阵

来源:互联网 发布:c语言1到100的奇数和 编辑:程序博客网 时间:2024/05/29 15:22

ACM模版

描述

描述

题解

结点更新,区间求和,基础线段树。

代码

#include <iostream>#include <string>using namespace std;const int MAXN = 50000;string str;int sum;                    //  记录总兵数int num[MAXN + 1] = {0};    //  记录各个兵营的兵数typedef struct node{    int left;    int right;    int data;    node *lchild;    node *rchild;    node()    {        left = right = data = 0;    }} Tree;Tree *CreateTree(int a, int b){    Tree *r;    r = (Tree *)malloc(sizeof(Tree));    r->left = a;    r->right = b;    if (a == b)    {        r->data = num[a];        r->lchild = r->rchild = NULL;    }    else    {        int mid = (a + b) >> 1;        r->lchild = CreateTree(a, mid);        r->rchild = CreateTree(mid + 1, b);        r->data = r->lchild->data + r->rchild->data;    }    return r;}void update(Tree *r, int a, int b){    if (r->left == a && r->right == a)    {        r->data += b;        return;    }    int mid = (r->left + r->right) >> 1;    if (a <= mid)    {        update(r->lchild, a, b);    }    else    {        update(r->rchild, a, b);    }    r->data += b;}void find(Tree* r, int a, int b){    if (r->left == a && r->right == b)    {        sum += r->data;        return ;    }    int mid = (r->left + r->right)>>1;    if (b <= mid)    {        find(r->lchild, a, b);    }    else if (a > mid)    {        find(r->rchild, a, b);    }    else    {        find(r->lchild, a, mid);        find(r->rchild, mid + 1, b);    }}int main(){    int T;    scanf("%d",&T);    int n, x, y;    int key = 0;    while (T--)    {        printf("Case %d:\n", ++key);        scanf("%d", &n);        for (int i = 1; i <= n; i++)        {            scanf("%d", &num[i]);        }        Tree *T;        T = CreateTree(1, n);        while (cin >> str)        {            if (str == "Query")            {                sum = 0;                scanf("%d%d", &x, &y);                find(T, x, y);                printf("%d\n", sum);            }            else if (str == "Add")            {                scanf("%d%d", &x, &y);                update(T, x, y);            }            else if (str == "Sub")            {                scanf("%d%d", &x, &y);                update(T, x, -y);            }            else            {                break;            }        }    }    return 0;}
0 0