线段树

作者: iamsonormal2333 | 来源:发表于2016-11-22 00:07 被阅读20次
    #include <iostream>
    using namespace std;
    
    struct node {
        int l, r;
        int max, sum;
        node *lchild, *rchild;
    };
    
    int s, t, num;
    
    node * BuildTree(int l, int r, node *now) {
        if (l >= r)return nullptr;
        now->lchild = new node;
        now->rchild = new node;
        if (l == r - 1)return nullptr;
        now->lchild = BuildTree(l, (l + r) / 2, now->lchild);
        now->rchild = BuildTree((l + r) / 2, r, now->rchild);
        now->l = l;
        now->r = r;
        now->max = now->sum = 0;
        return now;
    }
    
    int change(int l, int r, node *now) {
        if (now == nullptr)
            return 0;
        if (l >= t || r <= s)return now->max;
        int l_max, r_max;
        if (l >= s&&r <= t) {
            now->sum += num*(r - l);
            now->max += num;
            if (l == r - 1)
                return now->max;
            change(l, (l + r) / 2, now->lchild);
            change((l + r) / 2, r, now->rchild);
            return now->max;
        }
        if (l == r - 1)
            return now->max;
        if (l <= s&&r <= t) 
            now->sum += (r - s)*num;
        if (l >= s&&r >= t) 
            now->sum += (t - l)*num;
        if (l >= s&&r <= t) 
            now->sum += (r - l)*num;
        l_max = change(l, (l + r) / 2, now->lchild);
        r_max = change((l + r) / 2, r, now->rchild);
        now->max = l_max > r_max ? l_max : r_max;
        return now->max;
    }
    
    int get_sum(int l, int r, node *now) {
        if (now == nullptr)
            return 0;
        if (l >= t || r <= s)return now->sum;
        if (l >= s&&r <= t)
            return now->sum;
        if (l == r - 1)
            return now->sum;
        return get_sum(l, (l + r) / 2, now->lchild) + get_sum((l + r) / 2, r, now->rchild);
    }
    
    int get_max(int l, int r, node *now) {
        if (now == nullptr)
            return 0;
        if (l >= t || r <= s)return -10000000;
        int l_max, r_max;
        if (l >= s&&r <= t)
            return now->max;
        if (l == r - 1)
            return now->max;
        l_max = get_max(l, (l + r) / 2, now->lchild);
        r_max = get_max((l + r) / 2, r, now->rchild);
        int max_num = l_max > r_max ? l_max : r_max;
        return max_num;
    }
    
    int main() {
        node *head = new node;
        int n;
        int left, right;
        cin >> left >> right;
        char a;
        BuildTree(left, right, head);
        cin >> n;
        while (n--) {
            cin >> a;
            if (a == 'c') {
                cin >> s >> t >> num;
                change(left, right, head);
            }
            if (a == 'm') {
                cin >> s >> t;
                cout<<get_max(left, right, head)<<endl;
            }
            if (a == 's') {
                cin >> s >> t;
                cout<<get_sum(left, right, head)<<endl;
            }
        }
        system("pause");
        return 0;
    }
    

    哪天找道题目测一下,这里涉及到建树、修改、删除、查找四种操作。

    相关文章

      网友评论

        本文标题:线段树

        本文链接:https://www.haomeiwen.com/subject/bqkppttx.html