HDU 1166 敌兵布阵

来源:互联网 发布:淘宝雪纺衫花色衬衣 编辑:程序博客网 时间:2024/06/16 03:40

裸线段树题目,关于线段树的知识可以先看基本的教材,几乎任一本数据结构里都有的。

先贴一下,动态申请内存的线段树,不过这种方法容易MLE

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;const int maxn=50005;int sum,num[maxn]={0};typedef struct node{    int l,r,data;    node *chl,*chr;    node(){        l=r=data=0;    }}Tree;Tree *build(int s,int t){    Tree *rt;    rt=new(Tree);    rt->l=s;    rt->r=t;    if(s==t){        rt->data=num[s];        rt->chl=rt->chr=NULL;    }    else{    int mid=(s+t)>>1;    rt->chl=build(s,mid);    rt->chr=build(mid+1,t);    rt->data=rt->chl->data+rt->chr->data;    }    return rt;}void updata(Tree *rt,int d,int v){    if(rt->l==d&&rt->r==d){        rt->data+=v;        return ;    }    int mid=(rt->l+rt->r)>>1;    if(d<=mid)updata(rt->chl,d,v);    else updata(rt->chr,d,v);    rt->data+=v;}void query(Tree *rt,int s,int t){    if(rt->l==s&&rt->r==t){        sum+=rt->data;        return ;    }    int mid=(rt->l+rt->r)>>1;    if(t<=mid)query(rt->chl,s,t);    else if(s>mid)query(rt->chr,s,t);    else {        query(rt->chl,s,mid);        query(rt->chr,mid+1,t);    }}int main(){    int t,n;    scanf("%d",&t);    for(int i=1;i<=t;i++){        scanf("%d",&n);        for(int j=1;j<=n;++j)            scanf("%d",num+j);        printf("Case %d:\n",i);        Tree *T;        T=build(1,n);        char com[10];        while(scanf("%s",com)){        if(com[0]=='E'){            break;        }        int d,v;        scanf("%d%d",&d,&v);        if(com[0]=='Q'){            sum=0;            query(T,d,v);            printf("%d\n",sum);        }        else if(com[0]=='A')  updata(T,d,v);        else updata(T,d,-v);        }    }    return 0;}

再来一下以数组建立的线段树,因为是平衡二叉树,所以建立比较容易。(Notonlysucess风格,参见其线段树完全版)


#include <cstdio>#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int maxn=60005;int sum[maxn<<2];void PushUp(int rt){    sum[rt]=sum[rt<<1]+sum[rt<<1|1];}void build(int l,int r,int rt){    if(l==r){        scanf("%d",&sum[rt]);        return ;    }    int m=(l+r)>>1;    build(lson);    build(rson);    PushUp(rt);}/*void upDate(int p,int add,int l,int r,int rt){    if(l==r){        sum[rt]+=add;        return ;    }    int m=(l+r)>>1;    if(p<=m)upDate(p,add,lson);    else upDate(p,add,rson);    PushUp(rt);}int query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R){        return sum[rt];    }    int m=(l+r)>>1;    int ret=0;    if(L<=m)ret+=query(L,R,lson);    if(R>m)ret+=query(L,R,rson);    return ret;}int main(){    int T,n;    scanf("%d",&T);    for(int cas=1;cas<=T;cas++){        scanf("%d",&n);        build(1,n,1);        printf("Case %d:\n",cas);        char op[10];        while(scanf("%s",op)){            if(op[0]=='E')break;            int a,b;            scanf("%d%d",&a,&b);            if(op[0]=='Q')printf("%d\n", query(a,b,1,n,1));            else if(op[0]=='S')upDate(a,-b,1,n,1);            else upDate(a,b,1,n,1);        }    }    return 0;}


0 0
原创粉丝点击