随笔分类 - [A] 解题报告(codeforces)
记录codeforces的题解
摘要:"Description" 思路 因为这些点要么在同一条路径上,要么相差1,所以把所有点向上移动一格,那么它们应该都在一条路径上。 如何判断在一条路径上?我的方法是按深度从下到上,判断下面结点的祖先是不是上面结点。所以用到了倍增发求LCA。
阅读全文
摘要:"Description" 思路 在前面预留m个空位,每次把一个数提前就放在前面预留的空位。一个数所在的位置就是它后面有多少个数,每次移动的时候更新最大最小值即可。
阅读全文
摘要:"Description" 思路 当总长为n,block长度为k时,把k看成一个整体,那么求k的个数相当于求总长为n k+1时,block长度为1的个数。 假设dp[n]代表的是总长为n中block长度为1的个数。我们要求的就是这个dp 1到n的值。 求block长度为1的个数,就是把总的情况数,减
阅读全文
摘要:"Description" 思路 由于$a_i$的取值非常小,所以把每个值所在坐标从小到大存起来。然后枚举每个$a_i$为回文的左右边界可得的最大长度。 枚举过程中,求两个$a_i$形成的区间中包含的重复次数最多的数。由于区间越大,重复的个数越多,所以从$a_i$的最左右两边到中间枚举。 统计区间某
阅读全文
摘要:"Description" 思路 这题的思想有点类似求树的重心。 首先思考一下如果只要求一个点的差值。那么显然,将这个点看作根节点,然后只要dfs一下,将与它连接的所有子树中各个最大差值求个和就是答案。 在dfs的过程中把每个结点的求的值记录下来,那么对于每个结点,下面的最大差值都已经求好了,就剩下
阅读全文
摘要:"Description" 思路 题目只对向上走有限制,但是对左右走没有限制,所以可以将宝藏的位置按照行处理。 由于每个宝藏都要遍历到,记录每一行左右两个端点的宝藏。我猜了一个贪心就是每到一行从一个端点走到另一个端点路程最短,不能从中间往两边走。 所以按照每一行判断上一行的左端点到这一行的右端点,或
阅读全文
摘要:"Description" 思路 以行为例,求每一行中存在黑颜色的左边界l和右边界r。那么橡皮擦必须要完全覆盖到这个区间[l, r]才可以使得这一行为白色。那么反过来,如果我们知道这个区间,我们就可以求所有完全覆盖这个区间的橡皮擦所在的位置(是一个矩形范围的区域)。这个区间对这个矩形区域的贡献为1,
阅读全文
摘要:"Description" 思路 求出每位数字表示0~9所需的棍子数(相当于代价)。这样就可以用背包dp来找出恰好有k个棍子下的解。 dp[i][k] 代表 已经确定了i位的数字后,当前还剩k个棍子的状态可取到的最大数字(最大0~9)。
阅读全文
摘要:"Description" 思路 首先先给集合里面的数分个组,将二进制中第i位为1的数分到第i组。显然,在同一组的所有数中,两两相与均不为0,故同一组的数全部都需要连边。 一个环的长度至少为3,所以一旦有一个组里面数的个数大于等于3,那么答案就是3。 否则,每一组当中个数至多为2,而且它们之间需要连
阅读全文
摘要:"Description" 思路 显然,如果一个团队所有人里面会的算法都不完全一样,那么肯定存在一个看不起所有人的人(会得最多或会得最偏)。因此一个团队至少有两个人会的算法一模一样(即a值一样)。同时,如果有一个人在一个团队,那么会的题和他相当或比他少(是他的子集)的人也可以加入这个团队。 当然,团
阅读全文
摘要:"Description" 思路 这E题有点暴力 由于不同的gcd(u, v)的个数不会超过$log_2V$,V是树上最大的数,所以每个结点开个数组,保存从根节点到该节点的所有gcd值。暴力搞就好了。
阅读全文
摘要:"Description" 题目大意是给定不超过1000个和数(均小于1000)。用m(m using namespace std; typedef long long ll; const int N = 1e3+10; define inf 0x3f3f3f3f int arr[N]; int c
阅读全文
摘要:"Description" 思路 做法一:组合数学 操作分三步,前两步选孩子再选礼物,最后一步再选孩子。 因此求出两步内选到礼物i的概率,再乘上想要礼物i的孩子的占比,求和所有礼物的结果就是答案。
阅读全文
摘要:"Description" 思路 题目大意是给定字符串s和c,要求交换s中至多两个字符,使得s字典序严格小于c。如果不存在输出“ ”,否则输出交换后的s。 一开始总想着分类讨论。但是情况实在太多,写不过来。 后面看别人代码才知道应该先找到s交换两个字符后最小的字典序,然后再和c对比即可。 详见代码。
阅读全文
摘要:"Description" 思路 首先,求最大的最小值中的最大值本质是求最大值。 考虑用二分来枚举最大值是多少。假设枚举出了v,判断v是否可行。 将一行当中大于等于v的数设为1,小于v的数设为0。假设存在两行的01串可以互补成全1的串,说明存在最大值至少大于等于v,即v可行;反之不可行。 由于行数有
阅读全文
摘要:"Description" 思路 根据题意,可以转换为在时刻x可以对原数组任意一个数加区间$[1, 2^{x} 1]$中的数。只要求出刚好满足非递减序列每个位置要加的最少值中的最大值所在的最小的x的区间即可。
阅读全文
摘要:"Description" 思路 这题总觉得有些想法,但是就是写不出来。看了 "题解" 好久才想明白。(以下均图片来自cf "题解" ) 每个度数大于2的结点都是某些叶子结点的LCA,设这个结点为图中的C。虚线代表从叶子结点到C的路径,把路径上面的边全部合并,看成一条边。合并的边的权值就是路径上的边
阅读全文
摘要:Description 思路 题目大意就是求满足$xw + yd = p$的x和y,其中$0 \leq x,y \leq n$。 先求出w和d的最小公约数m,如果m不能整除p则无解;否则全部提出m。然后就可以用扩展欧几里得求出x,y的可行值。 由$y \geq 0$ 可知 \(p-wx \geq 0
阅读全文
摘要:"Description" 思路 对于D1的可以先按值排序,然后取前k个数按位置排序,取第p个的值。 对于D2,把询问全部存起来,按k排序。这样只要选取一种数据结构,可以快速地处理“一次插入一个值,求其中第p大的数”的问题。 这里可以选用树状数组来处理求第p大的数这样的问题。树状数组的位置x代表比x
阅读全文
摘要:"Description" 思路 异或又叫做半加,它与和加法的区别就是不会进位。可知 $a+b=(a⊕b)+2(a\&b)$ $2(a\&b)$就是进位的部分的值。 对于这一题,$b_i=b_{i 1}⊕a_i$可以写成$b_i=b_{i 1}+a_i 2(a_i\&b_{i 1})$。 因为$b_
阅读全文

浙公网安备 33010602011771号