摘要:
dp优化总结 一、滚动数组 典型的空间优化。 这应该是最最普通的一个优化了吧。。 对于某些状态转移第i个 只需要 用到第i 1个状态时,就可以用滚动数组,把第一维用0/1表示。 拓展1: 当一个状态转移要用到前m个转移时,我们依然可以滚起来,把第一维按模m的值滚起来。 拓展2: 若每一个决策可以选任 阅读全文
摘要:
dp 如果我们直接定义状态: $dp[i][t1][t2][t3][h1][h2][h3]$表示前i个,第一层宽度为t1,,第二层宽度为t2,第三层宽度为t3,第一层高度为h1,第二层高度为h2,第三层高度为h3的最小面积。 如果直接这样定义,你会发现,你不仅内存炸飞,时间也会T的飞起。 考虑优化状 阅读全文
摘要:
一个O(n)的解法。 不难发现有如下性质: 被改造成虫洞的边一定在最长路径上 那么,我们用类似提直径的方法把 这条路径给拎出来 就会形成这样的一棵树。 那么,对于一条边,若其被改成虫洞,最长路径会有如下三种情况: 依然是当前的最长路径 被改造边左端点的最长路径 被改造边右端点的最长路径 难道我们不用 阅读全文
摘要:
此题写法蛮多的,倍增和启发式合并的写法想必大家已经了解了,本人稍微提一下好了。 而至于按秩合并和整体二分的写法,本人就稍微详细地讲解一下。 解法一:生成树+倍增 用克鲁斯卡尔算法构建出若干棵最大生成树,那么每个询问就转化成了求x到y路径上的最小边权,用倍增维护即可。 代码: c++ include 阅读全文
摘要:
数论 由于p是素数,考虑到费马小定理: $$ a^{p 1} \equiv 1 (mod p) $$ 而再观察,函数$f(x)$要求的值都是0或1 那么,将费马小定理变一下: $$ (x i)^{p 1} \equiv 1 (mod p)(x \neq i) $$ $$ (x i)^{p 1} \e 阅读全文
摘要:
点分治 这道题还有很多种其它写法,什么长链剖分啦,启发式合并啦等等。 首先,我们可以把点对$(u,v)$分成两类: 1.u到v的路径是一条链 2.u到v的路径不是一条链(废话) 对于第一类,显然$f(u,v)$就是链的长度,可以单独统计 对于第二类,就要在点分治上搞了 我们可以先计算出为d的倍数的点 阅读全文
摘要:
树上求值无非就这几种常见类型: 一 求子树的值 方法1:DFS做差 条件:可离线+可前缀做差 复杂度:$O(n)$ 优点:时间短 大致流程: 方法2:树剖+线段树/树状数组等区间型数据结构 条件:维护的值存在某种单调性 复杂度: 不算跳重链的话,为$O(nlog(n))$ 优点:可以支持路径区间修改 阅读全文
摘要:
"题目链接" 树的性质(O(n)写法) 很好的一道题。 当然,还有树上差分,点分治等写法。 联想树的直径,不难发现有这样一个性质: 所有教徒到离他最远的修道院的路径必定相交于一个节点。而这个节点就是一条最长路径的中点。我们称这个点为 中心 (特别的中点在于某条两点间的边上时,这条边的两个端点都可以作 阅读全文
摘要:
区间dp 理解了思路贼清晰。 先将点的x,y坐标离线。 状态定义 $dp_{i,j,k}$表示覆盖所有的点其x,y坐标满足$x \in [i,j]$且$y \ge k$所需的最小矩形数。 状态转移 两种方法: 1.$dp_{i,j,k}$由$dp_{i,x,k}$和$dp_{x+1,j,k}$转移过 阅读全文
摘要:
状压dp ~~本题特别yy,要好好感受一下~~ 一看到这道题,我们肯定会想到压槽位的使用情况来dp。但仔细一想,槽位上放的服务器不同还会对状态更新产生影响!因此不能压槽位的使用情况。 ~~然后,我就看了下AC人的代码~~ 再琢磨了一会儿,就想通了 先看个例子: 加完后,不难发现,$dis[1][3] 阅读全文