题目来自大神博客的线段树专题

http://www.notonlysuccess.com/index.php/segment-tree-complete/

 

hdu1166 敌兵布阵
题意:O(-1)
思路:O(-1)
线段树功能:update:单点增减 query:区间求和

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <utility>
#include <queue>
#include <stack>
using namespace std;
const int INF=1<<30;
const double eps=1e-6;
const int N = 50010;
int sum[N<<2],n,M;

void add(int x,int v)
{
    for(x+=M;x;x>>=1)
        sum[x]+=v;
}
int query(int l,int r)
{
    int res=0;
    for(l=l+M-1,r=r+M+1;l^r^1;l>>=1,r>>=1)
    {
        if(~l&1) res+=sum[l^1];
        if(r&1) res+=sum[r^1];
    }
    return res;
}
void run()
{
    scanf("%d",&n);
    for(M=1;M<=n+1;M*=2);
    memset(sum,0,sizeof(sum));
    int x,y;
    for(int i=1;i<=n;++i)
    {
        scanf("%d",&x);
        add(i,x);
    }
    char s[15];
    static int cas=1;
    printf("Case %d:\n",cas++);
    while(scanf("%s",s)!=EOF && s[0]!='E')
    {
        scanf("%d%d",&x,&y);
        if(s[0]=='Q')   printf("%d\n",query(x,y));
        else if(s[0]=='A') add(x,y);
        else  add(x,-y);
    }
}

int main()
{
//    freopen("case.txt","r",stdin);
    int _;
    scanf("%d",&_);
    while(_--)
        run();
    return 0;
}
View Code

相关文章:

  • 2021-11-15
  • 2022-12-23
  • 2021-09-30
猜你喜欢
  • 2022-01-09
  • 2022-12-23
  • 2022-12-23
  • 2021-10-08
  • 2022-12-23
  • 2021-07-16
相关资源
相似解决方案