【数据结构】【线段树】单点修改区间查询

来源:互联网 发布:淘宝注册地址怎么修改 编辑:程序博客网 时间:2024/05/16 16:58

#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;const int MAXSIZE = 50005;int T,n,x,y,a[MAXSIZE],sum[MAXSIZE*4];char ask[10];inline void update(int root)//上传节点信息 {sum[root]=sum[root<<1]+sum[root<<1|1];}void build(int now_root, int l, int r)//建立线段树 {if (l==r){sum[now_root]=a[l];return;}int mid=(l+r)>>1;build(now_root<<1,l,mid);build(now_root<<1|1,mid+1,r);update(now_root);}void modify(int i, int l, int r, int x, int d)//修改:在x处加d {if (l==r){sum[i]+=d;return;}int mid=(l+r)>>1;if (x<=mid) modify(i<<1,l,mid,x,d);else modify(i<<1|1,mid+1,r,x,d);update(i);}int query(int i, int l, int r, int L, int R)//询问L到R区间和 {if (L<=l&&r<=R)return sum[i];int mid=(l+r)>>1;int ans=0;if (L<=mid) ans+=query(i<<1,l,mid,L,R);if (mid<R) ans+=query(i<<1|1,mid+1,r,L,R);return ans;}int main(){scanf("%d",&n);for(int i=1; i<=n; i++)scanf("%d",&a[i]);build(1,1,n);//建立线段树 scanf("%s",ask+1);//读入操作命令:Add,Query,End while(ask[1]!='E'){scanf("%d%d",&x,&y);if (ask[1]=='A')modify(1,1,n,x,y);//在x处加y if (ask[1]=='Q')printf("%d\n",query(1,1,n,x,y));//询问x到y区间和 scanf("%s",ask+1);}return 0;}


这是HDU1166修改后的模板,用线段树维护区间和,支持单点修改和区间查询操作

0 0
原创粉丝点击