HDU_1166_线段树

来源:互联网 发布:诸葛亮北伐的战略 知乎 编辑:程序博客网 时间:2024/05/17 00:50

题意:给你一个数列,让你维护一个区间询问和区间查询,线段树或者树状数组:

1.线段树代码:

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;const int N =50000 + 100;int sum[N<<2];void bulid(int l, int r, int rt){    if(l == r)    {        scanf("%d", &sum[rt]);        return ;    }    int m = (l+r) >> 1, rtt = rt << 1;    bulid(l, m, rtt);    bulid(m+1, r, rtt+1);    sum[rt] = sum[rtt] + sum[rtt+1];}void update(int p, int add, int l, int r, int rt){    if(l == r)    {        sum[rt] += add;        return ;    }    int m = (l+r) >> 1, rtt = rt << 1;    if(p <= m)  update(p, add, l, m, rtt);    else        update(p, add, m+1, r, rtt+1);    sum[rt] = sum[rtt] + sum[rtt+1];}int query(int L, int R, int l, int r, int rt){    if(L<=l && r<=R)    {        return sum[rt];    }    int m = (l+r)>>1, rtt = rt<<1, ans = 0;    if(L <= m)  ans += query(L, R, l, m, rtt);    if(R > m)   ans += query(L, R, m+1, r, rtt+1);    return ans;}int main(){    int t, n, a, b;    char str[20];    scanf("%d", &t);    for(int i=1; i<=t; ++i)    {        printf("Case %d:\n", i);        scanf("%d", &n);        bulid(1, n, 1);        while(scanf("%s", str))        {            if(str[0] == 'E') break;            if(str[0] == 'A') scanf("%d%d", &a, &b), update(a, b, 1, n, 1);            else if(str[0] == 'Q') scanf("%d%d", &a, &b), printf("%d\n", query(a, b, 1, n, 1));            else if(str[0] == 'S') scanf("%d%d", &a, &b), update(a, -b, 1, n, 1);        }    }    return 0;}

2.树状数组代码:

#include <iostream>#include <string>#include <algorithm>#include <cstdio>#include <cstring>using namespace std;int a[50001], c[50001];int n;int lowBit(int x){    return x&(-x);}void Update(int pos, int delta){    while(pos <= n)    {        c[pos] += delta;        pos += lowBit(pos);    }}int getresult(int pos){    int sum = 0;    while(pos > 0)    {        sum += c[pos];        pos -= lowBit(pos);    }    return sum;}void Build(){    for(int i=1; i<=n; ++i)    {        scanf("%d", &a[i]);        Update(i, a[i]);    }}int main(){    int T, i, j, a, b;    char s[10];    scanf("%d", &T);    for(i=1; i<=T; ++i)    {        memset(c, 0, sizeof(c));        scanf("%d", &n);        Build();        printf("Case %d:\n", i);        while(scanf("%s", s) && s[0] != 'E')        {            scanf("%d%d", &a, &b);            if(s[0] == 'A')                Update(a, b);            else if(s[0] == 'S')                Update(a, -b);            else                printf("%d\n", getresult(b)-getresult(a-1));        }    }    return 0;}


0 0