其他分享
首页 > 其他分享> > hdu1166 敌兵布阵

hdu1166 敌兵布阵

作者:互联网

题目链接

线段树模板题

线段树我是拿一个结构体(struct)存的:

struct Tree {int l,r,len;}a[(N<<2)+10];

建树:

void Build(int l,int r,int s)//建树 
{
    a[s].l=l;
    a[s].r=r;
    a[s].len=r-l+1;
    if(l==r)//叶子节点,返回 
    {
        b[s]=num[l];
        return;
    }
    int mid=(r+l)>>1;
    Build(l,mid,s<<1);//建左子树 
    Build(mid+1,r,(s<<1)|1);//建右子树 
    b[s]=b[s<<1]+b[(s<<1)|1];
}

区间求和(查询):

int query(int l,int r,int s)//区间查询 
{
    if(a[s].l>=l&&a[s].r<=r) return b[s];//完全包含,直接返回 
    int ans=0;
    if(a[s<<1].r>=l) ans+=query(l,r,s<<1);//处理左子树 
    if(a[(s<<1)|1].l<=r) ans+=query(l,r,(s<<1)|1);//处理右子树 
    return ans;
}

单点更新:

void change(int s,int x,int v)//单点更新 
{
    if(a[s].l==a[s].r) {b[s]+=v;return;}//到达叶子节点,修改 
    int mid=(a[s].l+a[s].r)>>1;
    if(x<=mid) change(s<<1,x,v);//处理左子树 
    else change((s<<1)|1,x,v);//处理右子树 
    b[s]=b[s<<1]+b[(s<<1)|1];//更新 
}

完整代码:

#include<bits/stdc++.h>
using namespace std;
#define N 50000
struct Tree {int l,r,len;}a[(N<<2)+10];
int b[(N<<2)+10],num[N+10];
void Build(int l,int r,int s)
{
    a[s].l=l;
    a[s].r=r;
    a[s].len=r-l+1;
    if(l==r)
    {
        b[s]=num[l];
        return;
    }
    int mid=(r+l)>>1;
    Build(l,mid,s<<1);
    Build(mid+1,r,(s<<1)|1);
    b[s]=b[s<<1]+b[(s<<1)|1];
    
}
int query(int l,int r,int s)
{
    if(a[s].l>=l&&a[s].r<=r) return b[s];
    int ans=0;
    if(a[s<<1].r>=l) ans+=query(l,r,s<<1);
    if(a[(s<<1)|1].l<=r) ans+=query(l,r,(s<<1)|1);
    return ans;
}
void change(int s,int x,int v)
{
    if(a[s].l==a[s].r) {b[s]+=v;return;}
    int mid=(a[s].l+a[s].r)>>1;
    if(x<=mid) change(s<<1,x,v);
    else change((s<<1)|1,x,v);
    b[s]=b[s<<1]+b[(s<<1)|1];
}
int main()
{
    int T,c=0;
    scanf("%d",&T);
    while(T--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&num[i]);
        Build(1,n,1);
        string str;
        char s[10];
        ++c;
        printf("Case %d:\n",c);
        while(1)
        {
            scanf("%s",s);
            if(!strcmp(s,"Query")) 
            {
                int l,r;
                scanf("%d%d",&l,&r);
                printf("%d\n",query(l,r,1));
            }
            else if(!strcmp(s,"Add"))
            {
                int u,val;
                scanf("%d%d",&u,&val);
                change(1,u,val);
            }
            else if(!strcmp(s,"Sub"))
            {
                int u,val;
                scanf("%d%d",&u,&val);
                change(1,u,-val);
            }
            else if(!strcmp(s,"End")) break;
        }
    }
    return 0;
}

标签:struct,int,mid,len,敌兵,Build,hdu1166,query,布阵
来源: https://www.cnblogs.com/juruo-zzt/p/12088018.html