HDU-1166 线段树模板

来源:互联网 发布:r9网络不稳定怎么回事 编辑:程序博客网 时间:2024/06/08 03:20

HDU-1166 线段树模板


题意

N(N<=50000)表示N个营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。
接下来每行有一条命令,命令有4种形式:
(1)Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)
(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);
(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;
(4)End 表示结束,这条命令在每组数据最后出现;
每组数据最多有40000条命令

思路

暴力显然超时,查询/更新的命令数目很大,考虑使用线段树。

代码

#include <cstdio>#include <cstring>#include <cmath>#include <iostream>#include <algorithm>#include <queue>#include <vector>#include <map>#include <set>#include <stack>using namespace std;#define lson l, m, rt * 2#define rson m + 1, r, rt * 2 + 1const int maxn = 50005;int a[maxn];int tree[maxn * 2];void pushup(int rt) //自下而上维护线段树{    tree[rt] = tree[rt * 2] + tree[rt * 2 + 1];}void build(int l, int r, int rt){    if (l == r)        tree[rt] = a[l];    else    {        int m = (l + r) / 2;        build(lson);        build(rson);        pushup(rt);    }}int query(int a, int b, int l, int r, int rt) //询问操作{    if (a <= l && r <= b)        return tree[rt];    int m = (l + r) / 2;    int ans = 0;    if (a <= m)        ans += query(a, b, lson);    if (m < b)        ans += query(a, b, rson);    return ans;}void update(int p, int c, int l, int r, int rt) //自下而上更新线段树{    if (l == r)    {        tree[rt] += c;    }    else    {        int m = (l + r) / 2;        if (p <= m) update(p, c, lson);        else update(p, c, rson);        pushup(rt);    }}int main(){    int T;    scanf("%d", &T);    for (int ii = 1; ii <= T; ++ii)    {        printf("Case %d:\n", ii);        int n;        scanf("%d", &n);        for (int i = 1; i <= n; ++i)            scanf("%d", &a[i]);        build(1, n, 1);        char s[7];        while (scanf("%s", s) && s[0] != 'E')        {            int x, y;            scanf("%d %d", &x, &y);            if (s[0] == 'Q')                printf("%d\n", query(x, y, 1, n, 1));            else if (s[0] == 'A')                update(x, y, 1, n, 1);            else if (s[0] == 'S')                update(x, -y, 1, n, 1);        }    }    return 0;}
原创粉丝点击