随笔分类 - 笔记
摘要:求整个串和每个后缀的最长公共前缀,复杂度线性。代码如下: for(int i=2;i<=cnt;i++){ if(p+z[p]>i)z[i]=min(z[i-p+1],p+z[p]-i); while(c[z[i]+1]==c[i+z[i]])z[i]++; if(i+z[i]>p+z[p])p=i
阅读全文
摘要:感觉就是一种技巧层面的东西。 有的时候我们希望统计一类最优型问题,而求解最优的过程中又需要通过 DP 来解决,此时就可以使用到这个叫做 DP 套 DP 的技巧。具体而言我们可以把内层的 DP 值当成状态存入外层 DP 中进行转移。而且这一类问题的内层 DP 的值的种类不会太大,否则无法当成状态存储。
阅读全文
摘要:最基础的形式。 考虑化简。 $$ \begin{aligned} &\sum\limits_{i=0}^n\lfloor\frac{ai+b}{c}\rfloor\ =&
阅读全文
摘要:首先是NTT的板子。 int cnt[N]; void NTT(int a[],int lim,bool type){ for(int i=0;i<(1<<lim);i++)cnt[i]=(cnt[i>>1]>>1)|((i&1)<<(lim-1)); for(int i=0;i<(1<<lim);
阅读全文
摘要:SAM review 板子 先复习一下 SAM 的构建过程吧。SAM 本质上是以 endpos 树为基础生成的一个 DAG。构建思路是这样的:对于一个字符串 ,先新建一个点 ,其对应的位置集合是 ,它的 显然应该等于当时的字符串长度(或者说是 $len(last)
阅读全文
摘要:还是刷了一些题,总结一下吧。 枚举顺序 AT_arc108_e 用 表示选择了 之后的期望长度。转移上枚举下一个数是谁,有方程: $$ f_{l,r}=1+\frac{1}{cnt}\sum\limits_{l<i<r,a_l\le a_i\le a_r}f_{l,i
阅读全文
摘要:SA 后缀排序的中心思想是倍增,为了优化常数会使用一些比较特别的技巧。写法上主要分为两个部分,即预处理部分和倍增部分。首先定义几个数组, 是排名为 的数组的位置, 是后缀 的排名, 是第一关键字 的位置, 是按第二关键字排序后的数组
阅读全文
摘要:AC 自动机是更高维的 kmp。构造方法感觉更像是运用了 dp 的思想,先对所有模式串建立一棵 Trie 树,然后考虑某个节点 ,有个 的后缀,考虑如何去求它的 fail 值。于是就有了 AC 自动机的核心代码: int x=q.front(),ff=t[x].fail;q.pop()
阅读全文
摘要:模拟赛中遇到了,被迫花了一天来学习。 轮廓线 DP 本质上是逐格转移的状压 DP,有特别经典的图可以说明: 思想上非常好理解,就是把分界处的状态压缩起来。主要是实现上有许多技巧需要说一下。第一个是状态的表示方法,在大多数情况只需要用 0/1 来代表这个位置是否存在插头即可,一般会以二进制或者四进制的
阅读全文
摘要:更应该说是一种思想吧。 我们希望知道恰好选择 个物品时的答案,但世界上哪来的那么多恰好呢。令 是恰好选择 个物品时的答案,那么点集 常会形成一个凸包,于是要知道特定 的答案,就只需要二分出这个点的斜率,然后用截距加上横坐标乘斜率即可,这个过程就
阅读全文
摘要:一篇比较初步的方法总结。 矩阵快速幂优化递推最经典的应用是快速求斐波那契数列的某一项,由于过于简单在这里没有什么必要提。由此引申出一类和上面一样单纯地优化递推过程的题目。经典题目如 跳房子link,用 代表跳到 的方案数,用 表示 的前缀和,那么根据定义有 $
阅读全文
摘要:初学笔记,目前水平仅限于板子。 李超线段树可以维护很多直线(或者线段),并可以查询某个点上最高点或者最低点。思想是考虑当前线段可能会更新哪些区间,对于一个区间而言,有一个之前的最优线段和当前线段,如果当前线段更优则交换二者位置。然后用得到的次优线段去更新比最优线段优的那半个数轴,递归处理即可,复杂度
阅读全文
摘要:又叫 SOSdp。一般而言可以使用高维前缀和来统计形如: 的问题。代码上的形式如下: for(int i=0;i<20;++i) for(int j=0;j<n;++i) if((1<<i)&j) S[j]+=(S[j^(1<<i)]); C
阅读全文
摘要:好久没碰数论了,感觉自己的基础挂得一塌糊涂,复习一下这玩意吧。 希望求得 ,先同时除以 gcd 化成 的形式。然后呢用欧几里得的思想,假设我们已经求得了 的答案,即已知: ,也就是说: $$ x_0b+y_0(a-
阅读全文
摘要:有标号无根树和 prufer 序列形成双射的关系。所以有一些性质。 其构造方式是拿一棵树出来,它有许多叶子。找出这些叶子中编号最小id,记录下它的父亲,丢掉。重复这一过程,会得到一个长度为 的序列,即 prufer 序列。用堆可以做到单 log,当然也有线性做法(如果它丧心病狂想卡的话)
阅读全文
摘要:两个知识点。 首先是最小树形图,意思是有一张带权有向图,钦定一个点,希望保留一些边使得这个点可以到达所有点,最小化边权和。思路上就是说贪心地选择每个点权最小的入边并加入集合中,这样形成的图兴许是最优的(和某B开头的最小生成树算法异曲同工)。但是有可能会出现环,此时就需要缩点,然后一直做下去即可。就这
阅读全文
摘要:非常幼稚和不严谨的学习笔记。 前置 板板 const double eps=1e-8; struct node{ double x,y;node(double xx=0,double yy=0){x=xx,y=yy;} inline void in(){scanf("%lf%lf",&x,&y);}
阅读全文