hdu 1166 敌兵布阵(树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166

题意:

已知初始时n个营地的人数以及之后的变化情况,试在变化过程中计算某一区间营地的人数和。

(1≤n≤50000,每组数据最多有40000条命令)

思路:

树状数组入门题。

#include <bits/stdc++.h>
using namespace std;

#define lowbit(a) ((a)&(-a))

const int M=55000;

int c[M];

void update(int x,int y,int n)
{
    for(int i=x;i<=n;i+=lowbit(i))
        c[i]+=y;
}

int getsum(int x)
{
    int ans=0;
    for(int i=x;i;i-=lowbit(i))
        ans+=c[i];
    return ans;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);

    int t;cin>>t;
    for(int i=1;i<=t;i++)
    {
        int n;cin>>n;
        memset(c,0,(n+1)<<2);
        for(int x=1;x<=n;x++)
        {
            int y;cin>>y;
            update(x,y,n);
        }
        cout<<"Case "<<i<<":"<<"\n";
        while(true)
        {
            string s;cin>>s;
            if(s[0]=='E') break;
            int x,y;cin>>x>>y;
            if(s[0]=='Q')
                cout<<getsum(y)-getsum(x-1)<<"\n";
            else if(s[0]=='A')
                update(x,y,n);
            else
                update(x,-y,n);
        }
    }

    return 0;
}
View Code

 

posted @ 2020-03-31 19:10  Kanoon  阅读(102)  评论(0编辑  收藏  举报