#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. servlet过滤器Filter使用之DelegatingFilterProxy类

    正常情况下,我们需要添加一个过滤器,需要实现javax.servlet.Filter接口,再在web.xml中配置filter,如下: package cc.eabour.webapp.securit ...

  2. NanUI

    https://github.com/NetDimension/NanUI/wiki/%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E NanUI基于ChromiumFX项目进 ...

  3. 浅谈矩阵加速——以时间复杂度为O(log n)的算法实现裴波那契数列第n项及前n之和使用矩阵加速法的优化求法

    首先请连矩阵乘法乘法都还没有了解的同学简单看一下这篇博客: https://blog.csdn.net/weixin_44049566/article/details/88945949 首先直接暴力求 ...

  4. python每日一练:0004题

    第 0004 题: 任一个英文的纯文本文件,统计其中的单词出现的个数. import re count = 0 with open('./EnglishText.txt','r') as f: tem ...

  5. C# 数据类型之间的转换

    C数据类型转换 https://www.cnblogs.com/bluestorm/p/3168719.html 1 字符串解析为整数: a = int.Parse (Console.ReadLine ...

  6. HNUSTOJ-1696 简单验证码识别(模拟)

    1696: 简单验证码识别 时间限制: 2 Sec  内存限制: 128 MB 提交: 148  解决: 44 [提交][状态][讨论版] 题目描述 验证码是Web系统中一种防止暴力破解的重要手段.其 ...

  7. mysql常见的查询语句

    select * from 表名     查询此表所有数据  select * from 表名 where 字段名 > 判断条件      查询某表中的某字段符合条件的数据 select * f ...

  8. NancyFx 2.0的开源框架的使用-ConstraintRouting

    新建一个空的Web项目 然后在Nuget库中安装下面两个包 Nancy Nancy.Hosting.Aspnet 然后在根目录添加三个文件夹,分别是models,Module,Views 然后往Mod ...

  9. Sublime-emmet插件的使用

    emmet是使用Sublime编写html代码时最好用的一个插件,下面简单介绍一下emmet插件的安装和使用 安装 第一步:打开sublime,首先输入command + shift + p,然后输入 ...

  10. 一条sql引发的“血案”

    前几天有一个项目要上线,需要对表的一个字段进行扩充,项目经理让我准备脚本,于是我准备了如下的脚本: )); )); )); 结果上线的时候,ord_log1和ord_log2表中有30万数据,在执行的 ...