首页 > 编程语言 >算法:线段树&&Luogu p3372题解

算法:线段树&&Luogu p3372题解

时间:2023-01-31 00:12:08浏览次数:35  
标签:&& 题解 线段 long 数组 Luogu 区间 维护 节点

前言

不愧是线段树,竟然卡我这么久,还是那句话:

十年OI一场空,不开long long见祖宗

#1 什么是线段树?

  • 线段树长什么样?

通俗一点,线段树就是线段,树
实际上,线段树是一棵完全二叉搜索树
我们对于线段树模型的理解,在于它的每一个节点都维护了一定的线段区间,而该节点的两个儿子节点分别二分维护这个区间,就这样一直二分下去,直到整个序列被二分殆尽。
我们可以用简单的进制数学严格的证明线段树可以维护到所有区间。

  • 线段树可以干什么?

刚才所说的维护,范围很广,可以求区间最值,求和,求乘积,除了在线性序列上的线段树,还有维护二维数组的矩阵树和三维数组的空间树
我们一般研究一维线段树。

  • 误区?
    ST表和线段树的区别:ST表不带修,线段树带修。

#2 如何建立一棵线段树。

首先,对于一棵完全二叉树,如果用一维数组来存的话,节点 \(k\) 的左子和右子就分别是 \(k*2\) 和 \(k*2+1\) ,我们改成位运算就是 \(k<<1\) 和 \(k<<1|1\)
所以,线段树的数组占空间很大,建议开 \(N\) 的四倍。
那么我们可以通过如下代码建立一棵维护区间和线段树:

int n;
long long a[100001];//原数组
long long t[100001<<2];//线段树数组
void pushup(int k){//这是更新父亲节点的函数
    t[k]=(t[k<<1]+t[k<<1|1]);//很简单的加法
}
void build(int k,int l,int r){//k:线段树上节点编号,l、r:该节点表示的区间左右端点
    if(l==r){//如果已经达到叶子节点
        t[k]=a[l];//直接更新
    }else{
        int mid=l+((r-l)>>1);//区间中点
	build(k<<1,l,mid);//建左子
	build(k<<1|1,mid+1,r);//建右子
	pushup(k);//更新父亲节点,这一步必须有
    }
}

标签:&&,题解,线段,long,数组,Luogu,区间,维护,节点
From: https://www.cnblogs.com/mornhus-xsylf-123/p/17077597.html

相关文章

  • CF1067E 题解
    题意传送门给定一棵\(n\)个节点的树,每条边有\(\frac{1}{2}\)的概率出现,可以得到一个森林,求这个森林邻接矩阵的秩的期望。\(1\len\le5\times10^5\)。题解此题关键......
  • [AHOI2022] 山河重整 题解
    T3,一个不错的数学题,给了不少的暴力分。Statement求有多少值域为\([1,n]\)的集合,01背包可以凑出\(1\simn\)中的所有数字。Subtask\(1\sim6\)我们从小到大选择每......
  • 微信小程序-【转发好友】以及中文标题乱码问题解决
    微信小程序的转发功能,参考官方文档,使用的buttom的open-type功能,下面是转发功能的具体实现。//通过按钮的open-type="share"实现转发,触发onShareAppMessage函数<butto......
  • 洛谷P2375 [NOI2014] 动物园【题解】
    题目简要对于字符串\(......
  • 部分互测题,专项测试题题解
    互测部分1https://www.cnblogs.com/Chencgy/p/16970117.html2A.营救皮卡丘跑弗洛伊德,搞出\(i->j\)不经过比\(i,j\)编号大的点的最小花费每个点都要走一遍,套......
  • TypeDB Forces 2023 (Div. 1 + Div. 2) 题解
    更新中……A~D略。E.TheHarmonizationofXOR题目链接题意简述\(t\)组testcase,每组给定\(n,k,x\)三个数。求将\(1\simn\)划分成\(k\)个子序列(可以不连......
  • CF1787H Codeforces Scoreboard 题解
    鬼知道怎么会撞题的,甚至是没听过的OJ。首先不考虑对\(a_i\)取\(\max\),显然直接按照\(k\)降序排序最优。接下来考虑\(a_i\)的限制,如果取到了\(a_i\)一定放在最......
  • lg8945题解
    考虑一个20分的\(O(n^2)\)做法:枚举答案区间\([l,r]\),那么显然要把尽可能多的1填入\([l,r]\)。使用前缀和计算\([l,r]\)中\(0\)的个数,那么填入后的价值可以\(O(1)\)计算。......
  • npm ERR! ERESOLVE unable to resolve dependency tree 问题解决
    阅读原文-问题解决与原因分析安装命令增加--legacy-peer-deps修饰npminstall--legacy-peer-deps......
  • 【题解】P4916 [MtOI2018]魔力环
    锐评:小学奥数测验思路环+循环同构,一眼知群论。考虑类似P4980【模板】Pólya定理,用Burnside引理处理。令\(G\)为循环任意次构成的置换群,研究的“点”为染色......