05 2018 档案
摘要:【题目链接】 点击打开链接 【算法】 考虑求lca(x,y)的深度 我们可以将从根到x路径上的点都打上标记,然后,询问y到根上路径的权值和 那么,求sigma(depth(lca(i,z)))(l <= i <= r ),我们可以将区间[l,r]中的点依次打上标记,然后,询问点z到根路径 上的权值和
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 考虑求每个人可以不分的方案 那么,对于每件物品,我们把它分成n份,每一份对应分给每一个人,有C(a[i]+n-1,m-1)种方案,而总方案数就是每种 物品方案数的乘积 然后,根据容斥原理,ans = 至少0人没分到特产 - 至少1人没分到特产 + ... - C
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 用f[i][j]表示走到(i,j)这个位置有多少种方案,因为走到(i,j)这个位置,上一步一定在它左上角的矩形中,所以, f(i,j) = sigma( f(x,y) ) ( (x,y)在左上角的矩形中) 我们尝试将它画出来,发现是斜着的杨辉三角 然后,通过找规
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 线段树 对于一个节点,记录它从左端点延伸的最多的空房间的个数,从右端点延伸的最多的空房间个数,和该区间最多的连续 空房间个数 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 分四种情况讨论 : 1. 当前目录和目标目录是同一目录,不需要变换,答案为0 2. 当前目录是目标目录的祖先,答案为当前目录的深度 - 目标目录的深度 3. 当前目录是目标目录的孩子,答案为1 4. 当前目录和目标目录有最近公共祖先,答案为当前目录的深度 - 最
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 离线tarjan求最近公共祖先 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 倍增法求最近公共祖先 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 矩阵乘法优化递推 由于本博客不支持数学公式,所以不能将矩阵画出来,请谅解! 【代码】
阅读全文
摘要:【Problem A】 Square 【题意】 给一个n * n的01矩阵,要求一个最大的全1正方形子矩阵,输出它的面积 N <= 1000 【题解】 朴素的做法是先求二维前缀和,然后暴力找最大的正方形子矩阵,时间复杂度 : O(n^3) 期望得分 : 80 考虑优化,我们发现如果有边长为n的正方形
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 要求 f(g(0)) + f(g(1)) + f(g(2)) + ... + f(g(n-1)) 因为g(i) = k * i + b 所以原式 = f(b) + f(k+b) + f(2k+b) + .... + f((n-1)k+b) 令矩阵A = {1,1
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 要求 A^1 + A^2 + A^3 + ... + A^k 考虑通过二分来计算这个式子 : 令f(k) = A^1 + A^2 + A ^ 3 + ... + A^k 那么,当k为奇数时,f(k) = f(k-1) + A ^ k 当k为偶数时,f(k) =
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 设A[i][j]为走一条边,从i走到j的方案数 C[i][j]为走两条边,从i走到j的方案数,显然有 : C = A * A = A^2 C'[i][j]为走三条边,从i走到j的方案数,那么 : C' = C * A = (A * A) * A = A^3 ..
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 朴素算法,就是跑N-1遍floyd 而满分算法就是通过矩阵快速幂加速这个过程 【代码】 注意要离散一下
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 矩阵乘法快速幂 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 sum[i]表示前i个杯子中,杯子底下藏有球的杯子总数 那么,知道[i,j]这段区间中,藏有球的杯子总数的奇偶性,相当于知道sum[j] - sum[i-1]的奇偶性 我们发现,知道哪些杯子底下藏有球,就是需要我们知道所有sum[i]的奇偶性 因此,我们只需将所
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 笔者做这题参考了这篇博客 : https://blog.sengxian.com/solutions/bzoj-1016 推荐阅读 首先,我们需要知道三个定理 : 定理1 : 若A,B是两棵不同的最小生成树,它们的权值从小到大排列分别为 : W(a1),W(a2
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树状数组 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 dist[i][j][k]表示当前走到(i,j),走的步数除以3的余数为k的最小花费 spfa即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 dist[i][j]表示到达i号城市,使用了j次魔法,所用时间的最小值 那么,dist[i][j]可以转移到dist[k][j+1]和dist[k][j],一边spfa一边dp,即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 首先,跑floyd,计算最短路和最短路径数 然后,计算答案,枚举k,s,t,若dist[s][k] + dist[k][t] = dist[s][t], 那么,点对(s,t)对答案k的”贡献“就是c[s][k]*c[k][t]/c[s][t] 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树链剖分 子树的DFS序是连续的一段! 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 对于第一问,将这个图缩点,输出出度为零的点的个数 对于第二问,同样将这个图缩点,输出入度为零、出度为零的点的个数的最大值 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 先用tarjan缩点,然后找出度为零的点,即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树形背包 注意是一棵森林 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 先预处理 : 将序列反转,求最长下降子序列 对于每个询问,根据字典序性质,贪心即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 f[i][j]表示以i为根的子树中,最少删多少条边可以组成j个节点的子树 树上背包,即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 f[i]表示深度小于等于i的严格n元树 显然,一棵深度小于等于i的严格n元树,就是一个根节点,下面有n棵子树,这n棵子树都是深度小于等于i-1的严格n元树,每棵子树有f[i-1]种形态,根据乘法原理, 可知f[i] = f[i-1] ^ n + 1 那么最后f[
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树形DP ans = min{ | total - 2 * sum[k] | } (sum为以k为根的子树的权值和) 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 同样是树形DP,但是比较难,笔者做这题看了题解 令f[i][j]表示在以i为根的子树中 1.在以i为根的子树中建一些消防站 2.在节点j必须建一个消防站 3.以i为根的子树中,每个节点在满足距离不超过D的前提下,选一个子树内的节点或节点j作为“负责站” 4.节点
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树形DP 令f[i][0]表示 : 以i为根的子树中,若i不参加宴会,所能获得的最大愉悦值 f[i][1]表示 : 以i为根的子树中,若i参加宴会,所能获得的最大愉悦值 那么,如果i不参加宴会,它的下属就可以参加宴会,也可以不参加宴会,因此 : f[i][0]
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 floyd求最小环 输出路径的方法如下,对于i到j的最短路,我们记pre[i][j]表示j的上一步 在进行松弛操作的时候更新pre即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树形DP f[i][j]表示以i为根的子树中,选了j个叶子节点,所能带来的最大收益 不难发现这就是一个经典的背包问题,不过是在树上做背包罢了 最后,判断f[1][i]是否大于等于0,输出最大的i 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 这题描述有些繁琐,先简化一下题意 : 对于一棵无根树,删除一个节点,使得其余的联通块中,最大的联通块最小 那么,这题就很好做了 对这棵树进行一遍DFS,求出每个节点为根的子树的大小(记为size),再求出删除节点后,子树中最大的联通块的大小(记为mx) 那么,删
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 我们知道,一棵树上离某个节点最远的节点,可能是经过它的祖先,再到那个祖先的某个孩子,或者,是它的那颗子树中,离它最远的一个节点,就不难想到以下算法 : 第一遍DFS,搜出每个节点的子树中离它距离最远的孩子的距离和所经过的儿子,离它次远的孩子的距离和所经过的儿子
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 SPFA + SLF / LLL 优化 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树链剖分 每个宗教建一棵线段树,注意数据量大,要动态开点 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 这题有一个性质 : 位于顶层的干草堆可以满足宽度最小且高度最高 根据这个性质,用单调队列优化DP,即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 令cost(i,j) = 第i天到第j天走相同的路线,路线长度的最小值 那么,只需筛选出第i天到第j天可以装卸货物的码头,然后将这些码头之间连边,跑弗洛伊德(或其它最短路算法),即可 然后,我们用f[i]表示前i天,总成本最小是多少,显然有 : f[i] = m
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 只要第一行第一个数确定了,后面的数也都确定了 递推两遍即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 f[i][j]表示第i段到第j段,最少需要多少次全部消除 那么,当color[i] = color[j]时 : 若s[i] + s[j] > 2,根据题目中所说的“连锁反应”,很容易得到f[i][j] = f[i+1][j-1] 若s[i] + s[j] = 2
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 先考虑50分的做法 : f[i]表示以i结尾的本质不同的上升子序列的个数 则f[i] = sigma(f[j]) (j < i,a[j] < a[i]),注意如果a[j]不止一个,只需加上下标最大的即可,否则会重复计数 那么,100分的做法,其实就是用树状数组来
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 题目描述比较繁琐,但细心观察后,发现其实就是用kruskal算法求最小生成树 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 动态规划 我们发现,M只有两种取值,1和2,那么,只需分类讨论即可 当M = 1时,其实这个问题就成了就最大连续子段和的问题,只不过要选K段而已 用f[i][j]表示选到第i行,选了j段,那么,显然有 : f[i][j] = max{f[i-1][j],f[k]
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 弗洛伊德求最小环模板 我们知道,在一个环上,一定有一个有且仅有一个编号最大的点,设这个点为k,起点为i,终点为j,那么 mincost = dist[i][j] + cost[j][k] + cost[k][i] (dist[i][j]为i到j的最短路) 所以只
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 和HDU2167类似 先搜出一行内符合的状态,然后,f[i][j][k]表示第i行,第j种状态,放了k个,合法的方案,DP即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 状压DP 先搜出一行符合的情况,然后,f[i][j]表示第i行,状态为j,能够取得的最大值,DP即可 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 动态规划 f[i][j][x][y]表示当前选了i个男生,j个女生,男生与女生差最大为x,女生与男生差最大为y的方案数 转移很显然,笔者不再赘述 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 此题是一道好题! 首先,我们发现 : 付款方法数 = 不受限制的方法数 - 受限制的方法数 那么,我们怎么求呢? 我们用dp求出不受限制的方法数(f[i]表示买i元的东西,不受硬币限制,有多少种方案),只需用01背包的 方法就可以了,实现非常简单 那么受限制的方
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 动态规划 f[i]表示上一次打了第i只鼹鼠,所能打死的最多的鼹鼠数量 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 线段树,注意数据量大,要动态开点 【代码】
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 树链剖分 【代码】 本题,笔者求最近公共祖先并没有用树链剖分“往上跳”的方式,而是用倍增法。笔者认为这样比较好写,代码可读性 比较高 此外,笔者的线段树并没有用懒惰标记,只要当前访问节点的线段总数为1,那么就下传
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 显然,越狱情况数 = 总情况数 - 不能越狱的情况数 很容易发现,总情况数 = M^N 不能越狱的情况数怎么求呢? 我们发现,不能越狱的情况,其实就是第一个人任选一种宗教,后面n-1个人,每个人都选 一种与前面一个人不同的宗教,所以第一个人有M种选法,后N-1个
阅读全文
摘要:【题目链接】 点击打开链接 【算法】 线段树扫描线求周长并 【代码】
阅读全文

浙公网安备 33010602011771号