随笔分类 - BZOJ&HDOJ
摘要:Description 给定一个棋盘, 在棋盘上放入m个炮,使得炮两两之间不能攻击,求出方案数。 Solution 考虑设计一个dp,定义f[i][j][k]表示前i行、有j列放了一个炮、有k列放了两个炮的方案数。 有一个显然的结论:如果方案合法,那么任何一行(列)的炮的数量最多为2。 然后我们思考
阅读全文
摘要:Description Treap是一种简单的平衡树,可以实现插入元素,删除元素,求元素的排名,求排名为某某的元素,查询前驱后驱 treap的本质是一棵二叉搜索树。然而,二叉搜索树很容易使复杂度退化,所以我们在每个节点上产生一个随机值,按照堆的性质维护,这样treap的深度期望为logn。 在本题中
阅读全文
摘要:这是一道状压dp的入门练习题 我们可以预处理出每一行国王的合法摆放方案,然后进行dp。 我们定义f[i][j][k]表示前i行,第i行的状态为j且使用了k个国王的合法方案数,那么存在 f[i][j][k]=∑f[i-1][j'][k'],其中j&j'=0,j&j'<<1=0,j&j'>>1=0 注意
阅读全文
摘要:我们定义f[i][j]表示前j个数组成的长度为i的合法序列的个数,那么有 因此我们不难写出朴素dp的代码 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using nam
阅读全文
摘要:这道题是在基本的tarjan求割点的算法上进一步加深,加上了计数问题。 基本思路是显然的,我们必定要跑一遍tarjan求割点,之后我们就要分类讨论。 若这个点不是割点,那么把他的边去掉之后这个点就与原来的联通块分开了,一共有(n-1)对,因为(x,y),(y,x)算两对,所以答案为n-1<<1 若这
阅读全文
摘要:这是一道关于树的直径的好题,值得一刷。 本题有两个难点,一个是分类讨论k,另一个是代码的实现(其实还好)。 本题k可以为1或2,因此我们分类讨论一下。 当k=1时,我们可以任选两个点连接,假设我们一条边都不连接,那么我们需要走2*m次,其中m为边的数量。假设我们在x,y上连一条边,那么我们用1个距离
阅读全文
摘要:这是一道非常不错的题目,融合了多种算法。 首先这是一道单源最短路问题,一个显然的做法就是直接用相关的算法解决,但是本题有负权边,所以我们不能用dijstra算法,只能用spfa,但是如果数据是精心设计,那么spfa算法很可能被卡死,所以简单的单源最短路算法无法直接通过本题。 仔细分析,这道题有一个特
阅读全文