关闭

HDU 1166 敌兵布阵 (线段树点更新/模板)

98人阅读 评论(0) 收藏 举报
分类:

题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66989#problem/A

代码:

#include<stdio.h>
#include<string.h>
using namespace std;

struct node
{
    int l,r;
    int sum;
} E[1000000*4];

void init(int l,int r,int i)                    //  建树
{
    E[i].l=l;
    E[i].r=r;
    E[i].sum=0;
    if(l!=r)
    {
        int mid=(l+r)/2;
        init(l,mid,2*i);
        init(mid+1,r,2*i+1);
    }
}

void Tree_change(int x,int m,int i)                      //  将 点x 的权值变为m
{
    if(x>=E[i].l&&x<=E[i].r)
    {
        E[i].sum=m;
    }
    if(E[i].l==E[i].r)
        return ;
    int mid=(E[i].l+E[i].r)/2;
    if(x>mid)
        Tree_change(x,m,2*i+1);
    else
        Tree_change(x,m,2*i);
    E[i].sum=E[2*i+1].sum+E[2*i].sum;
}

void Tree_add(int i, int val, int cur)           // 将 点x 的权值加上val
{
    if(E[cur].l==E[cur].r)
    {
        E[cur].sum=E[cur].sum+val;
        return;
    }
    int mid=(E[cur].l+E[cur].r)/2;
    if(i<=mid)
        Tree_add(i,val,cur*2);
    else
        Tree_add(i,val,cur*2+1);
    E[cur].sum=E[cur*2].sum+E[cur*2+1].sum;

}

int find_sum(int x,int y,int i)             //   查询函数   计算 x到y 中总和
{
    if(x==E[i].l&&y==E[i].r)
        return E[i].sum;
    int mid=(E[i].l+E[i].r)/2;
    if(x>mid)
        return find_sum(x,y,2*i+1);
    else if(y<=mid)
        return find_sum(x,y,2*i);
    else
        return find_sum(x,mid,2*i)+find_sum(mid+1,y,2*i+1);
}

int main()
{
    int k = 1;  //当前例子编号
    int t;      //样例数
    int n;      //营地数
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        init(1,n,1);
        for(int i=1; i<=n; i++)
        {
            int x;
            scanf("%d",&x);
            //Tree_add(i,x,1);                    //   付初始的权值
            Tree_change(i,x,1);
        }
        printf("Case %d:\n",k++);
        char s[10];
        int i,j;
        while(scanf("%s",s) != EOF)
        {
            if(s[0] == 'E')break;
            scanf("%d %d",&i, &j);
            switch(s[0])
            {
            case 'A':
                Tree_add(i, j, 1);
                break;
            case 'S':
                Tree_add(i, -j, 1);
                break;
            case 'Q':
                printf("%d\n",find_sum(i, j, 1));
                break;
            }
        }
    }
    return 0;
}
/*
Sample Input
1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End

Sample Output
Case 1:
6
33
59
*/


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:44169次
    • 积分:3090
    • 等级:
    • 排名:第11906名
    • 原创:274篇
    • 转载:7篇
    • 译文:0篇
    • 评论:5条
    文章分类
    最新评论