线段树入门题。跟着这个做的 http://www.notonlysuccess.com/index.php/segment-tree-complete/
题意:略。
本以为还需要延迟更新的,结果发现是自己想多了,结果用最原始的线段树,直接就A了。
#include<cstdio>
#include<cstring>
#include<iostream>
#define L(u) (u<<1)
#define R(u) (u<<1|1)
using namespace std;
const int N = 50001;
struct Node{
int l,r;
long long sum,add;
}node[N<<2];
long long arr[N];
void pushUp(int u)
{
node[u].sum = node[L(u)].sum+node[R(u)].sum;
}
void build(int u,int left,int right)
{
node[u].l = left,node[u].r = right;
node[u].add = 0;
if(node[u].l==node[u].r)
{
node[u].sum = arr[left];
return;
}
int mid = (node[u].l+node[u].r)>>1;
build(L(u),left,mid);
build(R(u),mid+1,right);
pushUp(u);
}
void addUpDate(int u,int p,int val)
{
if(node[u].l==node[u].r&&node[u].l==p)
{
node[u].sum += val;
return;
}
node[u].sum += val;
int mid = (node[u].l+node[u].r)>>1;
if(p<=mid) addUpDate(L(u),p,val);
else
addUpDate(R(u),p,val);
}
void subUpDate(int u,int p,int val)
{
if(node[u].l==node[u].r&&node[u].l==p)
{
node[u].sum -= val;
return;
}
node[u].sum -= val;
int mid = (node[u].l+node[u].r)>>1;
if(p<=mid) subUpDate(L(u),p,val);
else
subUpDate(R(u),p,val);
}
long long query(int u,int left,int right)
{
if(left<=node[u].l&&node[u].r<=right)
return node[u].sum;
int mid = (node[u].l+node[u].r)>>1;
if(right<=mid)
return query(L(u),left,right);
else if(left>mid)
{
return query(R(u),left,right);
}
else
{
return query(L(u),left,mid)+query(R(u),mid+1,right);
}
}
int main(void)
{
int T,v=0,a,b,n;
char str[10];
cin>>T;
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",arr+i);
build(1,1,n);
printf("Case %d:\n",++v);
while(scanf("%s",str),strcmp(str,"End")!=0)
{
if(strcmp(str,"Add")==0)
{
scanf("%d %d",&a,&b);
addUpDate(1,a,b);
}
else if(strcmp(str,"Sub")==0)
{
scanf("%d %d",&a,&b);
subUpDate(1,a,b);
}
else
{
scanf("%d %d",&a,&b);
printf("%lld\n",query(1,a,b));
}
}
}
return 0;
}
本文介绍了一种线段树的基本实现方法,通过一个简单的例子展示了如何构建、更新和查询线段树。文章提供了完整的C++代码实现,并通过具体的案例演示了线段树的操作流程。

276

被折叠的 条评论
为什么被折叠?



