第一个线段树~~就这样愉快的完成了
~1 a,还是比较开心。
昨天到今天看了个线段树的构造,已经区间查询,单点更新。
今天来练练手~~~
这个题就是个裸的线段树~~
不难!!!!!!!!!!!
要是对线段树不是很理解的同学 可以先看下这里
http://blog.csdn.net/lw277232240/article/details/77092634
里面有非常详细的线段树讲解
#include <iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define maxind 50000
int segTree[maxind * 4 + 10];
int array[maxind];
int n;
void build(int node, int begin, int end)
{
if(begin==end)
{
segTree[node]=array[begin];
return ;
}
else
{
build(node*2,begin,(begin+end)/2);
build(node*2+1,(begin+end)/2+1,end);
segTree[node]=segTree[node*2]+segTree[node*2+1];
}
}
int query(int node, int begin, int end, int left, int right)//构造线段树
{
int p1,p2;
if(begin>right||end<left) return -1;
if(begin>=left&&end<=right) return segTree[node];
p1=query(node*2,begin,(begin+end)/2,left,right);
p2=query(node*2+1,(begin+end)/2+1,end,left,right);
if(p1==-1&&p2==-1) return 0;
if(p1==-1) return p2;
if(p2==-1) return p1;
return p1+p2;
}
void Updata(int node,int begin,int end,int id,int add)//单点更新
{
if(begin==end)
{
segTree[node]+=add;
return ;
}
int mid=(begin+end)/2;
if(id<=mid) Updata(node*2,begin,mid,id,add);
else Updata(node*2+1,mid+1,end,id,add);
segTree[node]=segTree[node*2]+segTree[node*2+1];
}
void Updata1(int node,int begin,int end,int id,int add)//区间查询
{
if(begin==end)
{
segTree[node]-=add;
return ;
}
int mid=(begin+end)/2;
if(id<=mid) Updata1(node*2,begin,mid,id,add);
else Updata1(node*2+1,mid+1,end,id,add);
segTree[node]=segTree[node*2]+segTree[node*2+1];
}
int main()
{
int t;
scanf("%d",&t);
int case1=1;
char aa[10];
while(t--)
{
scanf("%d",&n);
int x,y;
printf("Case %d:\n",case1++);
for(int i=1;i<=n;i++)
{
scanf("%d",&array[i]);
}
build(1,1,n);
while(scanf("%s",aa))
{
if(aa[0]=='E') break;
if(aa[0]=='A')
{
scanf("%d%d",&x,&y);
Updata(1,1,n,x,y);
}
else if(aa[0]=='S')
{
scanf("%d%d",&x,&y);
Updata1(1,1,n,x,y);
}
else if(aa[0]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,1,n,x,y));
}
}
}
}