TTTTTTTTTTTTT LA 2191 树状数组 稍修改

题意:给出n个数字,操作有修改(S)和输出区间和(M)。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <set>
using namespace std;
typedef long long ll;
typedef unsigned long long Ull;
#define MM(a,b) memset(a,b,sizeof(a));
const double eps = 1e-10;
const int inf = 0x3f3f3f3f;
const double pi=acos(-1);
const int maxn=200000+5;

int data[maxn],n,cnt=0;
char a[5];

int lowbit(int i)
{
    return i&(-i);
}

int sum(int i)
{
    int ret=0;
    while(i>0)
    {
        ret+=data[i];
        i-=lowbit(i);
    }
    return ret;
}

void update(int i,int j)
{
    while(i<=n)
    {
        data[i]+=j;
        i+=lowbit(i);
    }
}

int main()
{
    while(~scanf("%d",&n)&&n)
    {
        MM(data,0);
        for(int i=1;i<=n;i++)
            {
                int u;
                scanf("%d",&u);
                update(i,u);
            }
        if(cnt>=1) printf("
");
        printf("Case %d:
",++cnt);
        while(~scanf("%s",a))
        {
            if(a[0]=='E') break;
            if(a[0]=='M')
            {
                int l,r;
                scanf("%d %d",&l,&r);
                printf("%d
",sum(r)-sum(l-1));
            }
            else
            {
                int i,j;
                scanf("%d %d",&i,&j);
                int k=sum(i)-sum(i-1);
                update(i,j-k);
            }
        }
    }
    return 0;
}

  分析:BIT模版题,,就是单点更新要转换成区间更新(因为BIT的每个节点都是对应区间,而不是单独

一个节点),输入输出格式本来弄错了,,题目说的是在两个case之间输出一个空格

原文地址:https://www.cnblogs.com/smilesundream/p/5414923.html