首页 > 其他 > 详细

看正月点灯笼老师的笔记—线段树

时间:2020-03-27 12:49:12      阅读:123      评论:0      收藏:0      [点我收藏+]

视频地址:https://www.bilibili.com/video/BV1cb411t7AM?from=search&seid=10066884482637263864

 

代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define N 1000
int a[N] = { 1,3,5,7,9,11 }, tree[N];
void build_tree(int node, int start, int end)
{
    //printf("%d %d\n", start, end);

    if (start == end)
        tree[node] = a[start];
    else
    {
        int mid = (start + end) / 2;
        int left_node = 2 * node + 1;
        int right_node = 2 * node + 2;

        build_tree(left_node, start, mid);
        build_tree(right_node, mid + 1, end);
        tree[node] = tree[left_node] + tree[right_node];
    }
}
void update_tree(int node, int start, int end,int id,int val)
{
    //printf("%d %d\n", start, end);

    if (start == end)
    {
        a[id] = val; 
        tree[node] = val;
    }
    else
    {
        int mid = (start + end) / 2;
        int left_node = 2 * node + 1;
        int right_node = 2 * node + 2;

        if (id >= start&&id <= mid)
            update_tree(left_node, start, mid, id, val);
        else
            update_tree(right_node, mid + 1, end, id, val);
        tree[node] = tree[left_node] + tree[right_node];
    }
}
int query_tree(int node, int start, int end, int L, int R)
{
    //printf("%d %d\n", start, end);

    if (start > R || end < L)  // 剪枝
        return 0;
    else if (L <= start&&R <= end)   // 剪枝
        return tree[node];
    else if (start == end)
        return tree[node];

    int mid = (start + end) / 2;
    int left_node = 2 * node + 1;
    int right_node = 2 * node + 2;
    int sum_left = query_tree(left_node, start, mid, L, R);
    int sum_right = query_tree(right_node, mid+1, end, L, R);

    return sum_left + sum_right;
}
int main(void)
{
    build_tree(0, 0, 5);
    update_tree(0, 0, 5, 4, 6);


    for (int i = 0; i <= 14; i++)
    {
        printf("%d ", tree[i]);
    }puts("");

    int sum= query_tree(0, 0, 5, 2, 5);

    printf("%d\n", sum);

    system("pause");
    return 0;
}

 

 

 

 

 

 

 

 

========= ======== ======= ======== ====== ===== ==== === == =

虞美人·听雨   蒋捷 宋 

 

少年听雨歌楼上。红烛昏罗帐。

壮年听雨客舟中。江阔云低、断雁叫西风。

而今听雨僧庐下。鬓已星星也。

悲欢离合总无情。一任阶前、点滴到天明。

 

看正月点灯笼老师的笔记—线段树

原文:https://www.cnblogs.com/asdfknjhu/p/12580456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!