1. #include<stdio.h>
  2. #define MAX_LEN 1000
  3. void build_tree(int arr[],int tree[],int node,int start,int end)
  4. {
  5. /*
  6. int arr[]: y
  7. int tree[]:
  8. int node:树的根节点
  9. int start:arr数组的
  10. int end:arr数组的
  11. */
  12. if(start==end)
  13. {
  14. tree[node] = arr[start];
  15. }
  16. else
  17. {
  18. int mid = (start+end)/2;
  19. int left_node = 2*node+1;
  20. int right_node = 2*node+2;
  21.  
  22. build_tree(arr,tree,left_node,start,mid);
  23. build_tree(arr,tree,right_node,mid+1,end);
  24. tree[node] = tree[left_node]+tree[right_node];
  25. }
  26. }
  27.  
  28. void update_tree(int arr[],int tree[],int node,int start,int end,int idx,int val)
  29. {
  30. /*
  31. int idx:要更改的数在arr中的编号
  32. int val:要替换更改的数的值
  33. */
  34. if(start==end)
  35. {
  36. arr[idx] = val;
  37. tree[node]=val;
  38. }
  39. else
  40. {
  41. int mid = (start+end)/2;
  42. int left_node=2*node+1;
  43. int right_node=2*node+2;
  44.  
  45. //判断要改的数据落在了哪一个分支上
  46. if(idx >= start && idx <=mid)
  47. {
  48. update_tree(arr,tree,left_node,start,mid,idx,val);
  49. }
  50. else
  51. {
  52. update_tree(arr,tree,right_node,mid+1,end,idx,val);
  53. }
  54. tree[node] = tree[left_node]+tree[right_node];
  55. }
  56.  
  57. }
  58. int qury_tree(int arr[],int tree[],int node,int start,int end,int L,int R)
  59. {
  60. //计算范围在L-R的和
  61. printf("start = %d\n",start);
  62. printf("end = %d\n",end);
  63. printf("\n");
  64. if(R<start||L>end)
  65. {
  66. return 0;
  67. }
  68. else if(L<= start && end<=R)
  69. {
  70. return tree[node];
  71. }
  72. else if(start==end)
  73. {
  74. return tree[node];
  75. }
  76. else
  77. {
  78. int mid = (start+end)/2;
  79. int left_node=2*node+1;
  80. int right_node=2*node+2;
  81. int sum_left = qury_tree(arr,tree,left_node,start,mid,L,R);
  82. int sum_right = qury_tree(arr,tree,right_node,mid+1,end,L,R);
  83. return sum_left+sum_right;
  84. }
  85. }
  86. int main()
  87. {
  88. int arr[]={1,3,5,7,9,11};
  89. int size = 6;
  90. int tree[MAX_LEN] = {0};
  91.  
  92. build_tree(arr,tree,0,0,size-1);
  93. printf("create:\n");
  94. int i;
  95. for(i=0;i<15;++i)
  96. {
  97. printf("tree[%d] = %d\n",i,tree[i]);
  98. }
  99.  
  100. printf("update:\n");
  101. update_tree(arr,tree,0,0,size - 1,4,6);
  102. for(i=0;i<15;++i)
  103. {
  104. printf("tree[%d] = %d\n",i,tree[i]);
  105. }
  106.  
  107. printf("qury_tree:%d\n",qury_tree(arr,tree,0,0,size-1,2,5));
  108. return 0;
  109. }

  

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. 双系统(win10+ubuntu)卸载Ubuntu系统

    之前装的双系统,Win10 和Ubuntu ,系统引导使用的是Ubuntu的Grup的引导, 直接删除Ubuntu会导致引导丢失,会很麻烦,win10直接会挂掉,后期恢复需要重建引导 安全删除思路,先 ...

  2. 学习《Oracle PL/SQL 实例讲解 原书第5版》----创建账户

    通过readme.pdf创建student账户. 以下用sys账户登录时都是sysdba. 一.PL/SQL 登录oracle. SYS/123  AS SYSDBA 账户名:sys:密码:123:作 ...

  3. [19/05/26-星期日] JavaScript_ 基本语法_运算符

    一.概念 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl ...

  4. ### Error building SqlSession. ### The error may exist in SQL Mapper Configuration ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: org.apache.ibat

    这是一个由粗心导致的错误,具体报错如下: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSessio ...

  5. Codeforces 990C (模拟+组合数学)

    题面: 传送门 分析: 此题O(n2l)" role="presentation" style="position: relative;">O( ...

  6. 移动端1像素解决方法,根据媒体查询transform缩放

    .borderOnePx{ position: relative; } .borderOnePx::after { content: ''; height:1px; background:#000; ...

  7. 调用SM30数据表维护的函数

    相关文章:http://www.cnblogs.com/caizjian/p/3248499.html 1.se11进去新建一个数据表 2.se55进去生产表维护 3.sm30进去维护数据表 4.se ...

  8. Linux性能优化从入门到实战:01 Linux性能优化学习路线

      我通过阅读各种相关书籍,从操作系统原理.到 Linux内核,再到硬件驱动程序等等.   把观察到的性能问题跟系统原理关联起来,特别是把系统从应用程序.库函数.系统调用.再到内核和硬件等不同的层级贯 ...

  9. 12JSP进阶

    1.EL表达式 1.1 简介 EL表达式替代jsp表达式.因为开发jsp页面的时候遵守原则:在jsp页面中尽量少些甚至不写java代码. EL表达式作用:向浏览器输出域对象中的变量或表达式计算的结果 ...

  10. 【编码的法则】谨慎的使用static

    概述 static主要有三种使用方式,其中前两种在C/C++中使用,第三种只在C++语言中使用 1)静态局部变量 2)静态全局变量/函数 3)静态成员变量/函数 3 静态成员变量/函数 3.1静态成员 ...