摘要:
前言 感谢$\_\_stdcall$的讲解,感谢伟大的导师$\_tham$提供一系列练手题 cdq分治是什么? 国人(~~陈丹琦~~)引进的算法,不同于一般的分治,我们常说的分治是将问题分成互不影响的几个区间,递归进行处理,而所谓$cdq$分治,在处理一个区间时,还要计算它对其他区间的贡献。 二维偏 阅读全文
摘要:
树形背包的一般形式 给定一棵有$n$个节点的点权树,要求你从中选出$m$个节点,使得这些选出的节点的点权和最大,一个节点能被选当且仅当其父亲节点被选中,根节点可以直接选。 $n^3$解法 原理 考虑设$f[u][i]$表示在$u$的子树中选择$i$个节点(包括它本身)的最大贡献,则可列出以下转移方程 阅读全文
该文被密码保护。 阅读全文
摘要:
逆序对 对于一个数列$a_1...a_n$,定义一有序对$(i,j)$当且仅当$ia_j$为逆序对。接着我们来考虑怎么求 1. 归并排序 回顾归并排序的过程,将当且的数列$[l,r]$分成两个长度相等的部分$[l,mid]$和$[mid+1,r]$,分治下去排序,每次合并的代价是区间的长度,所以得到 阅读全文
该文被密码保护。 阅读全文
摘要:
题意 给定一个包含$n$个数的序列$a$,在其中任选若干个数,使得他们的和对$m$取模后最大。($n\leq 35$) 题解 显然,$2^n$的暴枚是不现实的...,于是我们想到了折半枚举,分成两部分暴枚,然后考虑合并,合并的时候用two pointers思想扫一遍就行了。 其实这是一道折半枚举+T 阅读全文
摘要:
题意 给定一个集合,有多少个非空子集,能划分成和相等的两份。$n\leq 20$ 题解 看到这个题,首先能想到的是$3^n$的暴力枚举,枚举当前元素是放入左边还是放入右边或者根本不放,但是显然是不可取的,看到$n$只有20,考虑折半搜索,将集合分成两部分,每个部分$3^{\frac{n}{2}}$枚 阅读全文
摘要:
前言 “倍增”,作为一种二进制拆分思想,广泛用于各中算法,如$ST$表,求解$LCA$等等...今天,我们仅讨论用该思想来求解树上两个节点的$LCA$(最近公共祖先) “倍增”是什么东西? 倍增就是“成倍增加”的意思,比如$1$倍增后变成了$2$,$2$倍增后就变成了$4$,$4$变成$8$ 阅读全文
摘要:
1.1 前言 多重背包,想必看到这篇博文的人应该都知道了,这里仅仅列出伪代码($n$为物品个数,$m$为背包容积) 显然,这种算法的复杂度是很不可取的,于是我们来考虑优化 1.2 优化方式 设$c,v,w$分别为当前物品的个数,体积,价值,根据原始转移方程可知,$f_i$一定是由$f_{ 阅读全文