摘要: 可持久化线段树 顾名思义,就是可以存储历史信息的线段树。 比如我们对数组进行了n次修改,然后突然希望回到某个第i次版本。然后又基于这个版本进行一些新的修改等,就是可持久化线段树需要解决的问题。 我们仍然考虑单点修改与区间求和: 要点在哪里呢?实际上关键在于:我们不再修改每个老节点的信息,而是类似于动 阅读全文
posted @ 2022-08-13 15:18 s1monG 阅读(45) 评论(0) 推荐(0)
摘要: P3195 [HNOI2008]玩具装箱 原始方程 $dp_i=\min(dp_j+(sum_i+i-sum_j-j-L-1)^2)$. 我们设 $a_i=sum_i+i$ $b_i=sum_j+j+L+1$ $dp_i=\min(dp_j+(a_i-b_j)^2)$ 设$dp_i$ 由 $dp_j 阅读全文
posted @ 2022-08-13 13:38 s1monG 阅读(34) 评论(0) 推荐(0)
摘要: 点分治 前置知识:树的重心 树形dp即可。 对于一棵树,我们可以把其中的路径分为两种,一种是过根节点的,一种是不过根节点的。 过根节点的路径我们很容易处理: 我们枚举它的子树,把已经出现过的路径长度维护起来。 当枚举到下一个子树的时候,与上面维护的路径一同计算即可。 对于不过根节点的路径,我们怎么处 阅读全文
posted @ 2022-08-13 13:36 s1monG 阅读(34) 评论(0) 推荐(0)
摘要: 拓欧 求 $ax+by=\gcd(a,b)$ 要想求 $ax+by=\gcd(a,b)$ 先求 $bx'+(a \mod b)y'=\gcd(b,a \mod b)=\gcd(a,b)$ $bx'+(a-(a/b)\times b)y'=ax+by$ $bx'+ay'-((a/b)\times b) 阅读全文
posted @ 2022-08-13 13:36 s1monG 阅读(26) 评论(0) 推荐(0)
摘要: 线段树 线段树本质上的区间操作是把区间分解为一个个区间的分别操作。 如:对于操作$[2,8]$,分解为$[2,2],[3,4],[5,8]$ 对于线段树中的懒标记 (lazytag) 实质上是在一个父亲上整体做的操作而儿子还未进行的操作。 模板线段树2 #include<algorithm> #in 阅读全文
posted @ 2022-08-13 13:36 s1monG 阅读(41) 评论(0) 推荐(0)
摘要: 我们是怎么处理一条路径的呢?设这条路径端点是$u,v$,那么我们就可以把它当做$u-LCA(u,v)$和$LCA(u,v)-v$。 我们从端点开始,往LCA跳。 如果跳到轻边,直接处理即可,因为一条轻边两端一定有重边。 如果跳到重边,就用线段树维护一下,因为重边的下标一定在线段树中是连续的,跳到重链 阅读全文
posted @ 2022-08-13 13:34 s1monG 阅读(21) 评论(0) 推荐(0)
摘要: 例题P2015 二叉苹果树 原问题可以转化为留下$q+1$个点,求最多点权。 $f_{u,i}$表示以u为子树,包括u留下i个点的最多点权。 u有两个儿子是l和r。 那么$f_{u,i}=\max(f_{l,j}+f_{r,i-j-1})+val_u(0\leq j\leq i-1)$ 例题P135 阅读全文
posted @ 2022-08-13 13:34 s1monG 阅读(28) 评论(0) 推荐(0)
摘要: 为什么要 $j$ 指针在最小质因子时退出呢,因为一个数只能被其最小质因子筛去,否则就会用不是最小质因子向后筛。例如$15\times3=45$此时退出,要不然就会筛$15\times5=75$,而$75=3\times25$不应被5筛掉。 例题2 共有T次询问。如果一个正整数x小于N,而且x与N不互 阅读全文
posted @ 2022-08-13 13:34 s1monG 阅读(45) 评论(0) 推荐(0)
摘要: Trie字典树 是一种字符串的存储结构,节省空间,同时可以查询是否有字符串是其前缀,也是异或xor操作的利器。 POJ 3630 Phone List 模板: #include<algorithm> #include<cstring> #include<cstdio> const int MAXN= 阅读全文
posted @ 2022-08-13 13:33 s1monG 阅读(26) 评论(0) 推荐(0)
摘要: 树状数组 一种可以单点修改,查询前缀和的数据结构。 每次操作$O(\log n)$ 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 阅读全文
posted @ 2022-08-13 13:32 s1monG 阅读(40) 评论(0) 推荐(0)
摘要: 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 阅读全文
posted @ 2022-08-13 13:32 s1monG 阅读(40) 评论(0) 推荐(0)
摘要: 哈希 选取一个指质数为底数base(通常取131,13331,1e9+7,1e9+9),一个模数(通常取 unsigned long long 中自然溢出中的$2^{64}$)。 一个字符串$d$长度为$n$,哈希值为$h_n=\sum s_i \times base^i$。 它的子串$s-t$的哈 阅读全文
posted @ 2022-08-13 13:31 s1monG 阅读(161) 评论(0) 推荐(0)
摘要: Lca 定义:对于两个点,他们的最近公共祖先 是他们的祖先(或自己) 距离最近 $f_{i,j}$表示从节点i向上跳$2^j$步能到达的节点。 将较深的点跳到深度相同。 两个节点一起跳,直到相同。 如图:3和8的最近公共祖先是1。 树的深度为5,$\log_2 5=3$。更深的是8。 $f_{8,3 阅读全文
posted @ 2022-08-13 13:31 s1monG 阅读(52) 评论(0) 推荐(0)
摘要: 单调栈 例题1:Luogu5788 求解数组中元素右边第一个比它大的元素的下标。 由于要求解的是右边第一个大的元素,所以从右往左遍历。 维护一个从右到左递减的单调栈,最右是无限高。 每当有元素将要进栈,为了维护单调性,必须把单调栈中比它小的元素全部弹出。 因为它们已经没有用了,不可能被弹出的元素是某 阅读全文
posted @ 2022-08-13 13:30 s1monG 阅读(61) 评论(0) 推荐(0)
摘要: 二进制操作 将第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问题(遍历每一个点)($n \leq 20$) 设$f_{s 阅读全文
posted @ 2022-08-13 13:30 s1monG 阅读(25) 评论(0) 推荐(0)