摘要:
一种大树变小树的方法。大概就是只保留题目要求的关键点和其他一些统计答案必须的点,把剩余的所有点从树上砍掉。原理是维护一条最右链(就是我们扫到的最右边的一条链,它左边的虚树已经建好)。 具体的操作: 首先把所有的关键点按照dfs序排序。然后开始分讨: 如果栈空则节点入栈。 找到该点与栈顶的lca。 如 阅读全文
摘要:
并查集,是用代表元素来维护一个集合的数据结构。可以差不多$O(1)$地查询两个元素是否在同一个集合内。 并查集主要通过路径压缩和按秩合并减小复杂度。单独用的话最坏复杂度都是$O(logn)$的(虽然只路径压缩的均摊复杂度还是差不多$O(1)$)。分开讲。 首先是初始化,每个元素各自属于自己的集合。 阅读全文
摘要:
lca,即最近公共祖先。最近公共祖先,顾名思义,就是树上两个点最近的祖先。 我们大体上有三个算法来搞。 第一个:$O(nlogn)$预处理,$O(1)$查询。 大体上是借用了rmq问题的思路(就是区间最大/小值)来处理。 将树上问题转化为区间问题。 void dfs(int rt,int d){ v 阅读全文
摘要:
专门开个博客一是因为没地放了,二是以后次小生成树什么的就一块扔这了。 最小生成树 点数n,边数m的图的最小生成树大概有两个算法: Kruskal算法($O(m\log m)$) 思路非常简单粗暴,把所有边扔出来按照边权排个序,然后拿并查集维护点的连通关系,最后选出n-1条边。 int kruskal 阅读全文
摘要:
三个很基础的板子放到一块。发现原来没有位置放了于是现开一个。 upd:加了一个。 字符串哈希 hash的思想是把一个字符串拍成一个数存储,这样就能快速比较两个字符串是否相同。 大概的方法: 我们选取一个合适的进制数(比如131这样的质数)和一个较大的模数。 将这个字符串看作一个p进制数(因为每个字符 阅读全文
摘要:
二分图,顾名思义,能分成两部分,每部分之间没有边的图。判定很简单,染色法,没有奇环就行。 void dfs(int x,int col){ v[x]=col; for(int i=head[x];i;i=edge[i].next){ if(!v[edge[i].v])dfs(edge[i].v,3- 阅读全文
摘要:
其实就是spfa 话说看spfa的时候突然发现我原来判负环的板子是锅的然后wa了好几次 就是形如$x_i-x_j\le k$的一群问题。我们发现把这个东西移个项之后变成了 $$x_i \le x_j+k$$ 看着长的就很像最短路。所以就从$j$到$i$连一条权值为$k$的边,用最短路搞吧。特别的,有 阅读全文
摘要:
欧拉路 首先结论: 一个图存在欧拉路则每个点的入度等于出度或者一个点的入度比出度大一(终点),一个点的入度比出度小一(起点),其他点入度等于出度。 然后是朴实无华的爆算。 void dfs(int x){ for(int &i=head[x];i;i=head[x]){//这里推荐这么写 机房某大佬 阅读全文
摘要:
我也不知现在我学这个干什么但是真的闲着没事干又不想卷whk所以就来了。 首先前置芝士懵逼钨丝反演我之前已经差不多写过一个,但是有些结论建议看看oiwiki什么的反正我也没写。 首先杜教筛大家知道是个亚线性复杂度求积性函数前缀和的东西。于是现在我们有一个积性函数$f(i)$,要求它的前缀和$S(n)= 阅读全文
摘要:
joke3579大佬一直劝说我来切莫反 于是我切了一顿发现我一道都不会 所以写个这么个东西来稍微总结一下 莫比乌斯反演 首先莫比乌斯函数和狄利克雷卷积我就不说是什么东西了 整除分块不会的去看oiwiki抄一份过来就行 直接进入正题 反演公式 若$f(n)=\sum\limits_{d|n}g(d)$ 阅读全文