随笔分类 - 题解
摘要:"题目" 直接爆搜,每次将两个可以合并也就是正整数的值合并,然后删去任意一个值。中途需要注意得点是,在dfs中,temp数千万不要开全局变量。还有一点就是因为原题要满足结果输出要先输出大数,后输出小数,但还是尽量少用swap,尤其是在有temp保存值的时候,还是少用swap
阅读全文
摘要:"题目" 状压DP或者随机化贪心,DFS也能过,但需要掌握很多的搜索剪枝技巧。 本题的搜索剪枝技巧主要采用了减少重复的计算和最优化剪枝。 减少重复计算 由于原图被分为了两块,一块是已经被挖掘的点,一块是还未被挖掘的点。我们考虑每次枚举下一个要加上的点的时候,肯定要找到未被挖掘的点。为了枚举的时候快速
阅读全文
摘要:"题目" 因为该题需要求解方案数,因此我们不能用计数题的常用方法,即用递推来解决,类似于动态规划的思想。 我们用dp[i][j][h][o]表示第一个串枚举到了i,第二个串枚举到了j,A中取了h串,o表示选不选当前第i位的方案数。 可以得出以下的状态转移: 如果此位不选择的话
阅读全文
摘要:"题目" 首先考虑二分,然后发现最小长度越大的话,赛道就越少。所以可以用最终的赛道个数来判断长度是否合理。问题转化为给定一个长度,问最多有多少条互不重叠路径比这个给定长度大。 考虑贪心,毕竟贪心也是二分check函数的常用做法。原图毕竟为一棵树,每条路径都由一个端点一个终点和他们的LCA之间的连
阅读全文
摘要:"题目" 题意简化一下就是找题目给定的n个数最多能消掉多少个,我们用个tong[i]来记录i这个数值能不能用小于等于i的货币组合起来,等于1意味着他只能由自己本身的货币组成,等于2说明他可以被其他货币组成(此时的数不一定是货币,但等于2的货币不能要),最后只需要统计一下n个数里有几个tong等于1即
阅读全文
摘要:"题目" 悬线法的思想——即扫描线的思想,每个矩阵必定是由两个障碍来构成左右边界或者上下边界。 如果此两个障碍组成了左右边界,枚举这两个障碍中途更新这两个障碍之间的矩阵上下边界,并且更新最大值。 考虑如何线性求出两个障碍的矩阵上下边界, 我们可以把障碍按x坐标排序,然后对于每个障碍,都找x比他大的障
阅读全文
摘要:"题目" DP 设状态dp[i]为i位置放了斑点牛,前i个位置能得到的最多的牛。 有方程dp[i]=max(dp[j]+1,dp[i]),而我们并不知道什么j可以使i不在区间内 由于i位置放了牛,又因为i所在的区间只能放一个,j不能跟i同属于一个区间,又因
阅读全文
摘要:"题目" 数位DP 数位DP一般用于对满足一个什么条件的数的个数进行计数,且该数的数据范围很大的问题进行求解。这种题的状态一般都跟长度、限制条件、最高位上的数有关。 本题的状态为:dp[i][j]为长度为i的,最高位为j的windy数个数。 此状态有个非常简单的递推式,$dp
阅读全文
摘要:"题目" 差分约束+判正环 差分约束: 给定几个形如aibi=ci的不等式。 一般问题都会问aibj的最小值或最大值,或者是否所有条件都满足。 松弛操作$dis[now] dis[to]y=c);加入原题要问b a的最大值,则转化到图中就是x到y的最小值因为最大值要所有路径都要
阅读全文
摘要:"题目" 此题目中存在三种棋盘的放置方法(空白,不能活动,能活动)。 而每次变化的格子一定在当前空白格子的周围,因此只需要对空白格子的周围四个状态考虑即可,因此我们设a[i][j][k]为白格子在(i,j)的k方向的一个状态,然后我们考虑,如果活动和不能活动的格子已经确定了,那么如果按照暴力的解
阅读全文
摘要:"题目" 树链剖分 安装操作: 将1到x的点权统统_覆盖_为1,操作前覆盖一次,操作后覆盖一次。然后分别记录这两次1到x的路径点权和,求他们的差即是答案。 卸载操作: 输出x的子树点权值和,然后把x的子树点权统统_覆盖_为0。 覆盖操作可以用ODT,线段树,线段树的lazy数组初始值要赋为 1,因为
阅读全文
摘要:"题目" 树链剖分或者树上差分 树链剖分只能对点进行操作,所以把边权化为点权。树上化边权为点权的一般操作是把边权赋到深度较深的点里。 然后用树链剖分+线段树更改权值路径和+单点查询即可解决该问题。
阅读全文
摘要:"题目" 状压DP。 直接枚举二进制数表示当前猪有没有被消灭的状态。 最终答案的几条抛物线必定至少撞到一个猪。而且两头猪确定一条抛物线,可以枚举两头猪,分别求出他们的抛物线所消灭猪的状态,然后可以用类似背包的方法转移DP。 有方程: dp[i|(当前抛物线的状态)]=min(dp[i|(
阅读全文
摘要:"题目" 细节比较多的二分+跟LCA倍增差不多的思想 首先有这样一个贪心思路,深度越低的检查点越好,而最长时间和深度具有单调性,即给定时间越长,每个军队能向更浅的地方放置检查点。因此可以考虑二分时间,然后判断军队是否可以放置在控制疫情的地方。 但是有的军队需要先满足自己当前所在的节点,然后此节点如果
阅读全文
摘要:"题目" 树上差分 树上点差分,注意会出现路径端点多记录的情况,这时需要在最后输出的时候输出子树的差分数组的和 1,而不是在处理原数据的时候减1。并且a[n]不需要糖果,最后也减去就行。 c++ include define N 1001011 using namespace std; struct
阅读全文
摘要:"题目" 题目要求使一条边边权为0时,m条路径的长度最大值的最小值。 考虑二分此长度最大值 首先需要用lca求出树上两点间的路径长度。然后取所有比mid大的路径的交集,判断有哪些边在这些路径上都有出现,然后这些边里面取最大值当做虫洞,如果还是不行说明此mid不行。 判断边可以用把边化为点,然后树上差
阅读全文
摘要:"题目" 运用数学知识递推。定义DP[i][j][k]为前i行内选择j个列只有一个炮,k列只有两个炮的放置方案总数。 因为如果有一列或者一行的炮大于等于三时,必会有一个炮会被攻击到,所以可以用一个和两个来区分,方便递推。这样可以使的列里面的炮不会大于等于三,然后考虑行,这一行内只能放两个或一个,
阅读全文
摘要:"题目" 线段树。一开始以为是考查lazy数组的变化。然而并不是。 等差数列的性质是相邻的数的差相等,给一段数加上一段相邻的差相等的数列,会发现他们之间的差也会增加,而且相邻的数差增加的是一致的,又因为是单点查询一个数,相当于区间查询差分数组,因此可以用线段树区间修改差分数组,区间查询差分数组。
阅读全文
摘要:"题目" 搜索+剪枝 对于每个操作都只需要模拟就可轻松得出每一步操作的代码。 这个题需要考虑回溯操作,由于搜索是在一棵搜索树中,因此我们可以记录每一个深度的回溯状态,仅仅用一个数组会出现状态转移失误的情况,所以需要用多个数组。然后考虑剪枝,如果交换不交换没有区别,则不需要交换,而且i向左交换等同于i
阅读全文
摘要:"题目" 如果没有氮气加速器,则该题为一个模拟题。 但是本题存在氮气加速器,所以我们需要考虑贪心策略。 题目要求我们使所有人等待的时间最短,因此我们需要算出每段路径(路径即为车站之间的D)对时间的贡献多少,取其中最多的减去就好了。首先我们需要求出每个车站最远向右影响到什么地方,然后算出这段地方的
阅读全文