#include<stdio.h>
#define MAX_LEN 1000
void build_tree(int arr[],int tree[],int node,int start,int end)
{
/*
int arr[]: y
int tree[]:
int node:树的根节点
int start:arr数组的
int end:arr数组的
*/
if(start==end)
{
tree[node] = arr[start];
}
else
{
int mid = (start+end)/2;
int left_node = 2*node+1;
int right_node = 2*node+2; build_tree(arr,tree,left_node,start,mid);
build_tree(arr,tree,right_node,mid+1,end);
tree[node] = tree[left_node]+tree[right_node];
}
} void update_tree(int arr[],int tree[],int node,int start,int end,int idx,int val)
{
/*
int idx:要更改的数在arr中的编号
int val:要替换更改的数的值
*/
if(start==end)
{
arr[idx] = val;
tree[node]=val;
}
else
{
int mid = (start+end)/2;
int left_node=2*node+1;
int right_node=2*node+2; //判断要改的数据落在了哪一个分支上
if(idx >= start && idx <=mid)
{
update_tree(arr,tree,left_node,start,mid,idx,val);
}
else
{
update_tree(arr,tree,right_node,mid+1,end,idx,val);
}
tree[node] = tree[left_node]+tree[right_node];
} }
int qury_tree(int arr[],int tree[],int node,int start,int end,int L,int R)
{
//计算范围在L-R的和
printf("start = %d\n",start);
printf("end = %d\n",end);
printf("\n");
if(R<start||L>end)
{
return 0;
}
else if(L<= start && end<=R)
{
return tree[node];
}
else if(start==end)
{
return tree[node];
}
else
{
int mid = (start+end)/2;
int left_node=2*node+1;
int right_node=2*node+2;
int sum_left = qury_tree(arr,tree,left_node,start,mid,L,R);
int sum_right = qury_tree(arr,tree,right_node,mid+1,end,L,R);
return sum_left+sum_right;
}
}
int main()
{
int arr[]={1,3,5,7,9,11};
int size = 6;
int tree[MAX_LEN] = {0}; build_tree(arr,tree,0,0,size-1);
printf("create:\n");
int i;
for(i=0;i<15;++i)
{
printf("tree[%d] = %d\n",i,tree[i]);
} printf("update:\n");
update_tree(arr,tree,0,0,size - 1,4,6);
for(i=0;i<15;++i)
{
printf("tree[%d] = %d\n",i,tree[i]);
} printf("qury_tree:%d\n",qury_tree(arr,tree,0,0,size-1,2,5));
return 0;
}

  

C语言 | 线段树的更多相关文章

  1. bzoj5518 & loj3046 「ZJOI2019」语言 线段树合并+树链的并

    题目传送门 https://loj.ac/problem/3046 题解 首先问题就是问有多少条路径是给定的几条路径中的一条的一个子段. 先考虑链的做法. 枚举右端点 \(i\),那么求出 \(j\) ...

  2. UOJ#470. 【ZJOI2019】语言 虚树,线段树合并

    原文链接www.cnblogs.com/zhouzhendong/p/UOJ470.html 前言 做完情报中心来看这个题突然发现两题有相似之处然后就会做了. 题解 首先,我们考虑将所有答案点对分为两 ...

  3. Luogu5327【ZJOI2019】语言【树上差分,线段树合并】

    题目大意 给定一棵$n$个节点的树,维护$n$个集合,一开始第$i$个集合只有节点$i$.有$m$个操作,每次操作输入一个$(u,v)$,表示将$(u,v)$这条链上所有点所属的集合合并.求有多少个无 ...

  4. [ZJOI2019]语言[树链的并、线段树合并]

    题意 题目链接 分析 考虑枚举每个点的答案,最后除以 2 即可. 可以与 \(u\) 构成合法点对 的集合 为所有经过了 \(u\) 的链的并.因为这些链两两有交,根据结论 "树上两条相交的 ...

  5. [Luogu5327][ZJOI2019]语言(树上差分+线段树合并)

    首先可以想到对每个点统计出所有经过它的链的并所包含的点数,然后可以直接得到答案.根据实现不同有下面几种方法.三个log:假如对每个点都存下经过它的链并S[x],那么每新加一条路径进来的时候,相当于在路 ...

  6. Luogu5327 ZJOI2019语言(树上差分+线段树合并)

    暴力树剖做法显然,即使做到两个log也不那么优美. 考虑避免树剖做到一个log.那么容易想到树上差分,也即要对每个点统计所有经过他的路径产生的总贡献(显然就是所有这些路径端点所构成的斯坦纳树大小),并 ...

  7. [ZJOI2019]语言——树剖+树上差分+线段树合并

    原题链接戳这儿 SOLUTION 考虑一种非常\(naive\)的统计方法,就是对于每一个点\(u\),我们维护它能到达的点集\(S_u\),最后答案就是\(\frac{\sum\limits_{i= ...

  8. [LOJ3046][ZJOI2019]语言:树链的并+线段树合并

    分析 问题显然可以转化为对于每个节点询问所有这个节点的所有链的链并的大小. 考场上我直接通过树剖打标记+树剖线段树维护以\(O(n \log^3 n)\)的时间复杂度暴力实现了这个过程.(使用LCT或 ...

  9. 线段树学习----C语言

    /* 线段树学习:如果一个节点为i,那么他的左孩子为2I+1,右孩子为2i+2: */ #include<stdio.h> #define min(a,b) a<b?a:b; ]; ...

随机推荐

  1. axios 拦截以及 API简单配置(element)

    在某些情况下,有时候会在接口请求的API中需要拿到存在浏览器中的COOKIE,调用的方式可以为: // 获取浏览器Cookie function getCookie(cname) { var name ...

  2. python 操作openpyxl导出Excel 设置单元格格式以及合并处理

    贴上一个例子,里面设计很多用法,根据将相同日期的某些行合并处理. from openpyxl import Workbook from openpyxl.styles import Font, Fil ...

  3. Symmetric Tree(对称二叉树)

    来源:https://leetcode.com/problems/symmetric-tree Given a binary tree, check whether it is a mirror of ...

  4. mysql : 使用不等于过滤null的问题

    在写sql时遇到查询结果不对的情况,经查阅,发现是因为查询条件过滤null的问题:从网上找到如下资料: 在写SQL 条件语句是经常用到 不等于‘!=’的筛选条件,此时要注意此条件会将字段为null的数 ...

  5. CentOS 添加硬盘创建并挂载分区

    分区工具介绍: fdisk 创建MBR分区:所支持的最大卷:2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区 gdisk 创建GPT分区:突破MBR 4个主分区限制,每个磁盘最多支持1 ...

  6. e.target与e.currentTarget的区别,事件冒泡与事件捕获 ,事件委托

    e.target与e.currentTarget的区别:https://www.jianshu.com/p/1dd668ccc97a 事件冒泡与事件捕获 :https://www.jianshu.co ...

  7. 使用class 自动创建设备节点

    #include <linux/init.h>// __init __exit #include <linux/module.h> // module_init module_ ...

  8. AcWing 831. KMP字符串(模板)

    给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字. 模板串P在模式串S中多次作为子串出现. 求出模板串P在模式串S中所有出现的位置的起始下标. 输入格式 第一行输入整 ...

  9. IMAP协议学习笔记(一)

    IMAP IMAP(Internet Mail Access Protocol,Internet邮件访问协议)以前称作交互邮件访问协议(Interactive Mail Access Protocol ...

  10. Math对象(min()-max()-ceil()-floor()-round()和abs())

    1.Math.min() 功能:求一组数的最小值,返回值:Number 如果里面有非数字则返回NaN 2.Math.max() 功能:求一组数的最大值,返回值:Number 3.Math.ceil() ...