08 2022 档案
摘要:可持久化线段树 顾名思义,就是可以存储历史信息的线段树。 比如我们对数组进行了n次修改,然后突然希望回到某个第i次版本。然后又基于这个版本进行一些新的修改等,就是可持久化线段树需要解决的问题。 我们仍然考虑单点修改与区间求和: 要点在哪里呢?实际上关键在于:我们不再修改每个老节点的信息,而是类似于动
阅读全文
摘要:点分治 前置知识:树的重心 树形dp即可。 对于一棵树,我们可以把其中的路径分为两种,一种是过根节点的,一种是不过根节点的。 过根节点的路径我们很容易处理: 我们枚举它的子树,把已经出现过的路径长度维护起来。 当枚举到下一个子树的时候,与上面维护的路径一同计算即可。 对于不过根节点的路径,我们怎么处
阅读全文
摘要:线段树 线段树本质上的区间操作是把区间分解为一个个区间的分别操作。 如:对于操作 ,分解为 对于线段树中的懒标记 (lazytag) 实质上是在一个父亲上整体做的操作而儿子还未进行的操作。 模板线段树2 #include<algorithm> #in
阅读全文
摘要:我们是怎么处理一条路径的呢?设这条路径端点是 ,那么我们就可以把它当做 和 。 我们从端点开始,往LCA跳。 如果跳到轻边,直接处理即可,因为一条轻边两端一定有重边。 如果跳到重边,就用线段树维护一下,因为重边的下标一定在线段树中是连续的,跳到重链
阅读全文
摘要:为什么要 指针在最小质因子时退出呢,因为一个数只能被其最小质因子筛去,否则就会用不是最小质因子向后筛。例如 此时退出,要不然就会筛 ,而 不应被5筛掉。 例题2 共有T次询问。如果一个正整数x小于N,而且x与N不互
阅读全文
摘要:Trie字典树 是一种字符串的存储结构,节省空间,同时可以查询是否有字符串是其前缀,也是异或xor操作的利器。 POJ 3630 Phone List 模板: #include<algorithm> #include<cstring> #include<cstdio> const int MAXN=
阅读全文
摘要:树状数组 一种可以单点修改,查询前缀和的数据结构。 每次操作 void Modify(int x,int k) { for(; x<=n; x+=x&(-x)) t[x]+=k; } int Query(int x) { int res=0; for(; x; x-=x&(-x
阅读全文
摘要:CDQ 分治 归并排序 来自《算法导论》。 #include<algorithm> #include<cstdio> const int MAXN=1e6; int n,a[MAXN+10],l[MAXN+10],r[MAXN+10]; long long ans; void merge(int p
阅读全文
摘要:哈希 选取一个指质数为底数base(通常取131,13331,1e9+7,1e9+9),一个模数(通常取 unsigned long long 中自然溢出中的 )。 一个字符串 长度为 ,哈希值为 。 它的子串 的哈
阅读全文
摘要:Lca 定义:对于两个点,他们的最近公共祖先 是他们的祖先(或自己) 距离最近 表示从节点i向上跳 步能到达的节点。 将较深的点跳到深度相同。 两个节点一起跳,直到相同。 如图:3和8的最近公共祖先是1。 树的深度为5, 。更深的是8。 $f_{8,3
阅读全文
摘要:单调栈 例题1:Luogu5788 求解数组中元素右边第一个比它大的元素的下标。 由于要求解的是右边第一个大的元素,所以从右往左遍历。 维护一个从右到左递减的单调栈,最右是无限高。 每当有元素将要进栈,为了维护单调性,必须把单调栈中比它小的元素全部弹出。 因为它们已经没有用了,不可能被弹出的元素是某
阅读全文
摘要:二进制操作 将第k位设为1 x = x | (1 << k) 将第k位设为0 x = x & -(1 << k) 查询第k位 x & (1 << k) (x >> k) & 1 如果等于0,那么第k位是0,否则是1 状压dp 模板题:TSP问题(遍历每一个点)( ) 设$f_{s
阅读全文