线段树基础

来源:互联网 发布:qq飞车终极迈凯轮数据 编辑:程序博客网 时间:2024/05/17 07:09

HDU1166

题目链接

题目类型:线段树

题解:线段树经典题,维护区间和(存个模板);

Code:

#include <cstdio>//维护区间和using namespace std;int a[50005];int tree[50005*4];char s[100];void build(int p,int l,int r){    if(l==r)    {        tree[p]=a[l];        return ;    }    int mid = (l+r)>>1;    build(2*p,l,mid);    build(2*p+1,mid+1,r);    tree[p]=tree[2*p]+tree[2*p+1];}void add(int p,int l,int r,int x ,int num){    if(l==r)    {        tree[p]+=num;        return;    }    int mid=(l+r)>>1;    if(x<=mid)add(2*p,l,mid,x,num);    else add(p*2+1,mid+1,r,x,num);    tree[p]=tree[2*p]+tree[2*p+1];}int find(int p,int l,int r,int x,int y){    if(x <= l&& r <= y)    {        return tree[p];    }    int mid=(l+r)>>1;    if(y<=mid)return find(p*2,l,mid,x,y);    else if(x>mid)return find(2*p+1,mid+1,r,x,y);    return (find(p*2,l,mid,x,mid))+(find(p*2+1,mid+1,r,mid+1,y));}int main(){    int n,k=1,T;    scanf("%d",&T);    while(T--)    {        scanf("%d",&n);        printf("Case %d:\n",k);        k++;        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);        }        build(1,1,n);        while(scanf(" %s",s)!=EOF)        {            if(s[0]=='E')break;            int x,y;            scanf("%d%d",&x,&y);            if(s[0]=='A')            {                add(1,1,n,x,y);            }            else if(s[0]=='S')            {                add(1,1,n,x,-y);            }            else if(s[0]=='Q')            {                printf("%d\n",find(1,1,n,x,y));            }        }    }    return 0;}

(弱明天要考线代。。。可能会停更一回)

0 0
原创粉丝点击