线段树

来源:互联网 发布:淘宝童装平铺拍照技巧 编辑:程序博客网 时间:2024/06/06 15:39

线段树是很强大的数据结构,但本人感觉线段树不如树状数组好用。

线段树的基本用途:求和,max,min等,关键是搞清楚要维护的是什么。

下面是一段代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define N 50005using namespace std;int tree[4*N];int n;void add(int l,int r,int pos,int p,int v){    tree[pos]+=v;    if(l==r)return;    int mid=(l+r)>>1;    if(p<=mid)        add(l,mid,pos<<1,p,v);    else        add(mid+1,r,(pos<<1)+1,p,v);}int query(int l,int r,int pos,int L,int R){    if(L==l&&r==R)        return tree[pos];    int mid=(l+r)>>1;    if(R<=mid)        return query(l,mid,pos<<1,L,R);    else if(L>mid)        return query(mid+1,r,(pos<<1)+1,L,R);    else if(R>mid)        return query(l,mid,pos<<1,L,mid)+query(mid+1,r,(pos<<1)+1,mid+1,R);}int main(){   // freopen("in.txt","r",stdin);    int T,test=1;    int a,b;    char s[10];    scanf("%d",&T);    while(T--)    {        memset(tree,0,sizeof(tree));        scanf("%d",&n);        for(int i=1; i<=n; i++)        {            scanf("%d",&a);            add(1,n,1,i,a);        }        printf("Case %d:\n",test++);        scanf("%s",s);        while(s[0]!='E')        {            scanf("%d %d",&a,&b);            getchar();            if(s[0]=='Q')                printf("%d\n",query(1,n,1,a,b));            else if(s[0]=='S')                add(1,n,1,a,-b);            else if(s[0]=='A')                add(1,n,1,a,b);            scanf("%s",s);        }    }    return 0;} Download as text