• HDU 1166 敌兵布阵 线段树


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

      题目大意: 有一串儿数, 可以对某一个数加减或者对某一区间进行加和。

      解题思路: 最基础的单点更新和区间加和的线段树

      代码: 

    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <map>
    #include <cstring>
    #include <iterator>
    #include <cmath>
    #include <algorithm>
    #include <stack>
    #include <deque>
    #include <map>
    
    #define lson l, m, rt<<1
    #define rson m+1, r, rt<<1|1
    
    const int maxn = 50000+7;
    using namespace std;
    int sum[4*maxn];
    int arr[maxn];
    char op[10];
    
    void pushPlus( int rt ) {
        sum[rt] = sum[rt<<1] + sum[rt<<1|1];
    }
    
    void build( int l, int r, int rt ) {
        if( l == r ) {
            sum[rt] = arr[l];
            return;
        }
        int m = (l + r) >> 1;
        build(lson);
        build(rson);
        pushPlus(rt);
    }
    
    void Update( int p, int add, int l, int r, int rt ) {
        if( l == r ) {
            sum[rt] += add;
            return;
        }
        int m = (l + r) >> 1;
        if( p <= m ) {
            Update( p, add, lson );
        }
        else Update( p, add, rson );
        pushPlus(rt);
    }
    
    int Query( int L, int R, int l, int r, int rt ) {
        if( L <= l && r <= R ) {
            return sum[rt];
        }
        int m = (l + r) >> 1;
        int ans = 0;
        if( L <= m )
            ans += Query(L, R, lson);
        if( R > m )
            ans += Query(L, R, rson);
        return ans;
    }
    
    int main() {
        int t;
        scanf( "%d", &t );
        for( int cases = 1; cases <= t; cases++ ) {
            printf( "Case %d:
    ", cases );
            int n;
            scanf( "%d", &n );
            for( int i = 1; i <= n; i++ ) {
                scanf( "%d", &arr[i] );
            }
            build(1, n, 1);
            while( scanf( "%s", op ) && op[0] != 'E' ) {
                int a, b;
                scanf( "%d%d", &a, &b );
                if( op[0] == 'Q' ) {
                    printf( "%d
    ", Query(a, b, 1, n, 1) );
                }
                else if( op[0] == 'A' ) {
                    Update( a, b, 1, n, 1 );
                }
                else {
                    Update( a, -b, 1, n, 1 );
                }
            }
        }
        return 0;
    }
    View Code

      思考: 看了昨天多校的题, 发现没几道题能做, 所以现在开始学习线段树, 自己写代码的时候还是会有好多bug,主要是自己的思路没理清, 对树的理解不够深

  • 相关阅读:
    软件工程实践第三次作业——原型设计
    第三次作业补充
    软件工程实践之词频统计
    软工实践第一次作业
    B*树索引结构和内部管理(转)
    MySQL索引背后的数据结构及算法原理(转)
    Java编程军规
    差分隐私学习三:实现机制
    万能头文件#include <bits/stdc++.h>
    微信小程序-flex布局中align-items和align-self区别
  • 原文地址:https://www.cnblogs.com/FriskyPuppy/p/7285245.html
Copyright © 2020-2023  润新知