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

原创 2016年06月01日 17:42:33

题目: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
*/


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

题目链接HDU1166题目大意有N个(N
  • yyt330507870
  • yyt330507870
  • 2017年04月10日 21:33
  • 74

hdu 1166 敌兵布阵(线段树模板)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub...
  • loveyou11111111
  • loveyou11111111
  • 2015年08月30日 17:56
  • 179

hdu 1166 敌兵布阵 线段树模板

1,单结点更新 HDU http://acm.hdu.edu.cn/showproblem.php?pid=1166 #include #include using namespace std; co...
  • chen_minghui
  • chen_minghui
  • 2017年05月31日 08:48
  • 626

HDU 1166 敌兵布阵(线段树:点更新,区间求和)

HDU 1166 敌兵布阵(线段树:点更新,区间求和) 分析:线段树基本应用.参考资料: http://www.notonlysuccess.com/index.php/segment-tree-co...
  • u013480600
  • u013480600
  • 2014年03月24日 23:15
  • 853

[线段树 点更新 段查询]A - 敌兵布阵 HDU - 1166

**[线段树 点更新 段查询]A - 敌兵布阵 HDU - 1166 **
  • QQ877801131
  • QQ877801131
  • 2017年05月25日 21:00
  • 168

敌兵布阵(HDU - 1166)(线段树的点更新-区间查询)

敌兵布阵(HDU - 1166)C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要...
  • ZX_zengxi
  • ZX_zengxi
  • 2017年08月09日 20:33
  • 156

HDU 1166 敌兵布阵 线段树 部分和 点更新

原题: http://acm.hdu.edu.cn/showproblem.php?pid=1166对于这种数据量较大的数组,并且经常对单个点进行更新和修改查询,线段树是一种很好的数据结构。 查询...
  • qq_27508477
  • qq_27508477
  • 2015年07月31日 14:51
  • 190

HDU 1166 敌兵布阵(线段树:点更新,区间求和)

acm.hdu.edu.cn/status.php?first=&pid=1166&user=2014551422&lang=0&status=0 敌兵布阵 Time Limit: 2000/100...
  • hellohelloC
  • hellohelloC
  • 2015年08月17日 20:35
  • 477

HDU - 1166 A - 敌兵布阵 线段树单点更新模板

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于...
  • HowardEmily
  • HowardEmily
  • 2016年12月11日 15:10
  • 158

hdu 1166 敌兵布阵 线段树 点更新

// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就可以了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 虽然十分简单...
  • TIMELIMITE
  • TIMELIMITE
  • 2015年06月02日 21:33
  • 486
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 1166 敌兵布阵 (线段树点更新/模板)
举报原因:
原因补充:

(最多只允许输入30个字)