线段树详解
线段树的二三事
线段树有什么用?
作为一个比较复杂的数据结构能有如此的知名度,线段树一定有它的拿手绝活,
那么线段树能做什么呢?
简而言之,线段树可以高效地维护区间上对于某个操作结果的信息,
但这个操作必须符合结合律.
最有名的应用就是区间和。当然区间积,最值 (也可以用 ST 表) 也是可以的.
注意:线段树不支持动态添加节点,
因此如果需要修改区间长度的场合不能用线段树
线段树长什么样
从图上可以看出,线段树就是一颗二叉树.
其中的节点管理着一定区间内对应操作的结果.
父节点管理的区间是两个子结点管理的区间的并集.
子节点不断向自己的父亲节点传递信息,
而父节点存储的信息则是他的每一个子节点信息的整合.
线段树就是分块思想的树化,
或者说是对于信息处理的二进制化 -- 用于达到 O (logn) 级别的处理速度.
分块的思想,则可以用一句话总结为:
通过将整个序列分为有穷个小块,对于要查询的一段区间,
总是可以整合成 k 个所分块与 m 个单个元素的信息的并 ()().
但普通的分块不能高效率地解决很多问题,所以作为 log 级别的数据结构,
线段树应运而生.
分块的应用范围还 ...
树状数组
树状数组详解
简介
树状数组,顾名思义,就是像树一样组织的数组.
它的大体样子如下 (数组元素用 a 表示,树节点用 c 表示):
如图所示,
所谓树状数组就是在数组基础上加上一个向右倾斜的树结构维护一定的数组区间信息.
从图上可以看出, 管理 , 管理 , 管理 , 则管理全部 8 个数.
对于没有在图上显示的也是一样的.
c 与 a 的对应关系
10 进制下 c 和 a 的下标关系很难看出来,但是在 2 进制下:
其规律就是节点维护数组 a 中 (x -
lowbit (x), x] 的和
而 lowbit (x) 就是 x & -x 即 x 只保留最低位的 1 的值.
lowbit (x) 不仅代表所反应的区间长度,同时也是在树上的节点高度
构建
由于树状数组顶层节点的值由多个底层节点的值决定,
因此可以先确定底层节点的值再计算顶层的.
运行复杂度为 O (n)
// C++ Version// O(n)建树void init() { for (int i = 1; i <= n; ++i) { t[i] += a[i]; int j = ...
Hexo 插件系统简介以及几个插件的用法配置
作为一个可定制性极强的插件框架,hexo
支持方便地加载各种插件定制博客生成环节的每一步。也正因为此,围绕
hexo 诞生了一个活跃的插件开发社区.
我用 hexo 建博客这么久了,也出于需要寻找过插件,
还安装了不少。有些插件虽然功能优秀但是很久没更新了。因为实在是特别想要,
自己被迫肩负起维护的重任。还有想要的功能找不到合适的插件,
只能自己从头写起。于是就花了不少时间研究了一下 hexo 的插件系统.
为了让以后的自己不用费时费力从头学起,也希望能帮助到更多的朋友,
所以就把一些研究的重点写下来。顺便再附带上几款知名插件的配置和用法.
Markdown 插件系统简介
Hexo 的插件系统说简单也很简单。一种是简单的脚本,
另一种对应更复杂的正规插件.
脚本
把所有 JS 脚本放到项目根目录的 scripts 下,
hexo 就会在 初始化 的时候加载它们.
插件
为了更好的利用 npm 的分发系统,Hexo
搜寻根目录的 package.json, 将所有以 "hexo-"
开头的依赖视为插件。然后从根目录的 node_modules 下加载.
就和其它 npm 包一样,
每个 ...
Xiaoxin Pad Flashing.
Unlock BootLoader
Enable Unlock OEM Lock in Settings
Reboot to bootloader.
Execute fastboot flashing unlock.
Flash TWRP
Execute fastboot flash recovery twrp.img
Disable Boot Verification
fastboot flash vbmetta vbmeta.img
Reboot into recovery.
Format data and clean
Flash Magisk
Put magisk 21.4 to storage.
Install it in Recovery mode.
Reboot.
学会使用 Xargs
xargs 是 *shell* 中负责从标准输入和管道读取给定命令的选项以及参数的一个命令.
简单记录一下 Set 的一些选项
在任何 shell 教程中, set 命令总是被简单地提及然后就消失无踪.但是它其实值得花一篇文章的功夫详细讲述.
Systemd 单元文件介绍
文件路径与名字
在开始编写配置文件前,我们需要先了解一下一些设定.
文件存放路径
Systemd 从一下地方读取配置文件:
/usr/lib/systemd/system/: 存放绝大部分配置文件.
/etc/systemd/system/: systemd 启动时会默认执行的路径.
/usr/lib/sysemd/user/:
~/.local/share/systemd/user/
/etc/systemd/system/user:
~/.config/systemd/user/
名字约定
配置文件名字只能由 ASCII 字母,下划线和点组成.
末尾带有 @的是模板服务,子服务通过在 @后添加内容作为值,
将模板服务实例化。在模板中 代表那个值的字符为 % i.
编辑文件的道道
因为包配置文件会经常更新,所以直接修改包文件是个很蠢的办法.
为了能一劳永逸地完成修改,我们有两种方式:
在另一个地方覆盖原来的文件
使用 systemctl edit --full 在 /etc/systemd/system/ 中创建或打开对应的配置文件.
如果设置了默认启动,
修改完后使用 sy ...
Install Pintos on Archlinux
Pintos is a small project to finish for system study. But it is very
difficult for one linuxer to install it to their machine since it is way
too old. The passage is mainly about installing pintos on archlinux with
qemu.
Get Pintos
git clone git://pintos-os.org/pintos-anon
Install utility
Since stropts.h no longer exists on modern linux, we must
change dir to $ROOTDIR/src/utils and comment out
#include<stropts.h> in squish-pty.c and
squish-unix.c and lines 288-293 in squish-pty.c
run mak ...
Install and Configure KVM in ArchLinux
Introduction
KVM stands for Kernel-based Virtual Machine. This software allows
users to run multiple virtual machines with different operating systems,
thus bypassing the need to follow more conventional means of using
Virtualbox. KVM is free, open-source, and has been refined and improved
over the last ten years. This article shows you how to install and
configure KVM on your ArchLinux system.
Part 1: Installing KVM The installation procedure for KVM is a bit
complicated, as you must first che ...
Piano Setup
Pre-setup
Install vmpk, fluidsynth, qsynth,
timidity++ and soundfont-fluid.
Setting Up
Start qsynth, then click Setup
Change MIDI.MIDI Client Name ID(ALSA/CoreMidi) to
Qsynth1
Change Audio.Audio Driver to alsa.
In Soundfonts section, add
/usr/share/soundfonts/FluidR3_GM.sf2 to the list.
Restart qsynth
Start vmpk, then click MIDI Connections
Change Input MIDI Connection to the empty
Click the "..." next to MIDI OUT Driver.
Change Audio Driver to Alsa.