线段树

#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;
}

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容