ACM HDU 1166 敌兵布阵 简单的线段树 求区间和

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1166

AC代码

#include<iostream>
#include<string>
#include <algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long ll;
const int N = 1e5 + 5;
struct node
{
    int l,r;
    int nSum;
}tree[N*3];
int a[N];
void Build(int i, int l, int r)
{
    tree[i].l = l;
    tree[i].r = r;
    if (l == r)
    {
        tree[i].nSum = a[l];
        return;
    }
    int mid = (l+r) >> 1;
    Build(i<<1, l, mid);
    Build(i<<1|1, mid +1, r);
    tree[i].nSum = tree[i<<1].nSum + tree[i<<1|1].nSum;
}
void Add(int i, int j, int c)
{
    tree[i].nSum += c;
    if (tree[i].l == tree[i].r && tree[i].l == j)
    {
        return;
    }
    int mid = (tree[i].l + tree[i].r) >> 1;
    if (j <= mid) Add(i<<1, j,c);
    else if (j > mid) Add(i << 1|1, j ,c);

}
void Sub(int i, int j, int c)
{
    tree[i].nSum -= c;
    if (tree[i].l == tree[i].r && tree[i].l == j)
    {
        return;
    }
    int mid = (tree[i].l + tree[i].r) >> 1;
    if (j <= mid) Sub(i<<1, j,c);
    else if (j > mid) Sub(i << 1|1, j ,c);

}

int Query(int i, int a, int b)
{
    if (a == tree[i].l && b == tree[i].r)
    {
        return tree[i].nSum;
    }
    int mid = (tree[i].l + tree[i].r) >> 1;
    if (b <= mid) Query(i<<1, a, b);
    else if(a > mid) Query(i<<1|1, a, b);
    else
    {
        return Query(i<<1,a,mid)+Query(i<<1|1, mid + 1, b);
    }
}

int main()
{
    // ios::sync_with_stdio(false);cin.tie(NULL);
    int t;
    scai(t);
    for (int _  = 1; _ <= t; _++){
        printf("Case %d:\n", _);
        int n;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
        }
        Build(1,1,n);
        char s[20];
        while(1){
            scanf("%s", s);
            int t1, t2;
            if (strcmp(s, "Query") == 0)
            {

                scai(t1);
                scai(t2);
                printf("%d\n", Query(1,t1,t2));
            }
            else if (strcmp(s, "Add") == 0)
            {
                scai(t1);
                scai(t2);
                Add(1,t1,t2);
            }
            else if (strcmp(s, "Sub") == 0)
            {
                scai(t1);
                scai(t2);
                Add(1,t1,-t2);
            }
            else if (strcmp(s, "End") == 0)
            {
                break;
            }
        }
    }
}

原文地址:https://www.cnblogs.com/hulian425/p/12222775.html

时间: 2024-10-10 03:39:11

ACM HDU 1166 敌兵布阵 简单的线段树 求区间和的相关文章

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

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54411    Accepted Submission(s): 22830 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU 1166 敌兵布阵 (我的树状数组加线段树点修改模板)

思路:本题因为是点修改,所以我们可以用线段树或者是树状数组了.线段树的基本操作我在我的代码中会具体体现,关键是要理解下面这幅图,具体的思想大家可以去看看其他的资料 线段树AC代码: #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define N 50005 int num

HDU 1166 敌兵布阵 (线段树 &amp; 树状数组)

敌兵布阵 Time Limit:1000MS    Memory Limit:32768KB    64bit IO Format:%I64d & %I64u SubmitStatus 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的

HDU 1166 敌兵布阵(线段树)

Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况.由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视. 中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少

hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

敌兵布阵                                                                             Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵

hdu 1166:敌兵布阵(树状数组,练习题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 37773    Accepted Submission(s): 15923 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就

hdu 1166 敌兵布阵 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 题目意思:给出 N 个数你,通过对某些数进行更改(或者 + 或者 -),当输入的是 Query 的时候,需要计算出 某个区间的和. 树状数组第一题,算是模板吧 ^_^ 有个小细节,wa 了几次,细心~细心~~~细心 1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <

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

// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就可以了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 虽然十分简单,十分的水,继续加油 #include <algorithm> #include <bitset> #include <cassert> #include <cctype> #include <cfloat> #include <climits

HDU 1166 敌兵布阵 (线段树 单点更新)

题目链接 线段树掌握的很差,打算从头从最简单的开始刷一波, 嗯..就从这个题开始吧! 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cstdlib> 6 #include <algorithm> 7 const int maxn = 50000+10; 8 using namespace std