心如止水
Je n'ai pas le temps
posts - 400,comments - 130,trackbacks - 0
单个更新;维护区间和。
以下是我的代码:
#include<iostream>
#include
<string>
#define maxn 50007
#define L(x) (x<<1)
#define R(x) ((x<<1)+1)
using namespace std;
const string _1("Add");
const string _2("Sub");
const string _3("Query");
const string end("End");
struct
{
    
long a,b,sum;
}seg[maxn
*3];
long test,n,r[maxn];
void build(long node,long x,long y)
{
    
long mid=(x+y)>>1;
    seg[node].a
=x;seg[node].b=y;
    
if(x==y)
      seg[node].sum
=r[x];
    
else if(x<y)
    {
       build(L(node),x,mid);
       build(R(node),mid
+1,y);
       seg[node].sum
=seg[L(node)].sum+seg[R(node)].sum;
    }
}
void add(long node,long pos,long det)
{
    
long a=seg[node].a,b=seg[node].b,mid=(a+b)>>1;
    seg[node].sum
+=det;
    
if(a<b)
    {
       
if(mid>=pos)
         add(L(node),pos,det);
       
else add(R(node),pos,det);
    }
}
void sub(long node,long pos,long det)
{
    
long a=seg[node].a,b=seg[node].b,mid=(a+b)>>1;
    seg[node].sum
-=det;
    
if(a<b)
    {
       
if(mid>=pos)
         sub(L(node),pos,det);
       
else sub(R(node),pos,det);
    }
}
long getsum(long node,long x,long y)
{
    
long a=seg[node].a,b=seg[node].b,mid=(a+b)>>1,re=0;
    
if(x<=a&&b<=y)
      re
=seg[node].sum;
    
else
    {
       
if(mid>=x)
         re
+=getsum(L(node),x,y);
       
if(mid+1<=y)
         re
+=getsum(R(node),x,y);
    }
    
return re;
}
int main()
{
    
long a,b;
    
string cmd;
    cin
>>test;
    
for(long k=1;k<=test;k++)
    {
       cin
>>n;
       
for(long i=1;i<=n;i++) cin>>r[i];
       build(
1,1,n);
       cout
<<"Case "<<k<<":"<<endl;
       
while(cin>>cmd&&cmd!=end&&cin>>a>>b)
         
if(cmd==_1)
           add(
1,a,b);
         
else if(cmd==_2)
           sub(
1,a,b);
         
else if(cmd==_3)
           cout
<<getsum(1,a,b)<<endl;
    }
return 0;
}


posted on 2010-02-24 10:50 lee1r 阅读(418) 评论(0)  编辑 收藏 引用 所属分类: 题目分类:数据结构

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理