04 2020 档案
摘要:"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" 思路 加、乘、设值是常规操作,主要难点是解决p次方的求和操作。这里用sum数组分别存储1到3次方的求和结果。因为对2次方求和的操作需要1次方求和,对3次方求和的操作需要2次方求和。因此维护好三个值就可以直接套板子。 线段树区间操作有多种操作时,要注意操作的优先级。在pus
阅读全文
摘要:Description 寒假来了,又到了小明和女神们约会的季节。 小明虽为屌丝级码农,但非常活跃,女神们常常在小明网上的大段发言后热情回复“呵呵”,所以,小明的最爱就是和女神们约会。与此同时,也有很多基友找他开黑,由于数量实在过于巨大,怎么安排时间便成了小明的一大心事。 我们已知小明一共有T的空闲时
阅读全文
摘要:"Description" 思路 首先先给集合里面的数分个组,将二进制中第i位为1的数分到第i组。显然,在同一组的所有数中,两两相与均不为0,故同一组的数全部都需要连边。 一个环的长度至少为3,所以一旦有一个组里面数的个数大于等于3,那么答案就是3。 否则,每一组当中个数至多为2,而且它们之间需要连
阅读全文
摘要:Description 大意是要求实现一个可以给区间每个数开根,同时区间求和的线段树。 思路 由于开根后求和不等于求和后开根,所以每次更新都必须更新到根节点。所幸开根一个数到1之后再开根结果不变,所以如果发现某个线段的和等于r l+1说明无需再更新。 由于开根操作是指数级别,每个区间被更新的最大次数
阅读全文
摘要:Description 给定平面上若干矩形,求出被这些矩形覆盖过至少两次的区域的面积. 思路 和单纯的求面积非常相似,用len来储存被覆盖到两次以上的区间长度。
阅读全文
摘要:"Description" 思路 显然,如果一个团队所有人里面会的算法都不完全一样,那么肯定存在一个看不起所有人的人(会得最多或会得最偏)。因此一个团队至少有两个人会的算法一模一样(即a值一样)。同时,如果有一个人在一个团队,那么会的题和他相当或比他少(是他的子集)的人也可以加入这个团队。 当然,团
阅读全文
摘要:"Description" 思路 这E题有点暴力 由于不同的gcd(u, v)的个数不会超过$log_2V$,V是树上最大的数,所以每个结点开个数组,保存从根节点到该节点的所有gcd值。暴力搞就好了。
阅读全文
摘要:介绍 快速计算多个矩形覆盖区域的面积或者周长。 实现 求面积 oi_wiki的 "扫描线" 解释得很清楚了,就是求每次扫到得底边覆盖的长度乘上高的总和。 主要是代码实现的细节要注意。这里的线段树离散化处理记录一下。 "HDU1542 Atlantis"
阅读全文
摘要:"Description" 思路 板子题,需要离散化。然后从最后一张海报往前枚举看看有没有被完全覆盖。
阅读全文
摘要:功能 用$log_2n$时间复杂度对区间进行加减乘求和等等操作的数据结构。 实现 主要参考的是 "oi_wiki" 教程。 记录一下板子(即 "HDU1166 敌兵布阵" 的代码) 注意事项 1. 开4倍空间,再大点更好。 2. 叶结点不要pushdown,否则可能会越界(因为只开了4倍空间) 其它
阅读全文
摘要:"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可行;反之不可行。 由于行数有
阅读全文
摘要:介绍 计算字符串每个位置的最长回文串,也可以说是计算所有的回文区间。 原理 感觉算法思想和扩展kmp求extend数组十分类似。 先在第一个位置插入'$'以避免小于0的讨论,再在每一个字符之间都插入'#',为了避免对区间奇偶长度的讨论。 用len[i]代表位置i的最长回文右半区间的长度。由于经过上面
阅读全文
摘要:介绍 Knuth-Morris-Pratt字符串查找算法(简称为KMP算法) 用于字符串的模式匹配。相比朴素算法,它的时间复杂度为O(n + m),其中n是文本串长度,m是模式串长度。 原理 kmp通过计算模式串的next数组作为辅助来减少朴素算法中重复的比对。 next数组代表模式串的最长相同真前
阅读全文
摘要:作用 用于求一个串的字典序最小的循环串 原理 详见oi-wiki 最小表示法 算法思想是贪心。时间复杂度O(n) int findmin(char s[]) { //n为字符串长度 int k = 0, i = 0, j = 1; while (k < n && i < n && j < n) {
阅读全文
摘要:"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_
阅读全文
摘要:Description Given two strings s and t, count the number of tuples (i,j,k) such that 1. 1 ≤ i ≤ j ≤ |s| 2. 1 ≤ k ≤ |t|. 3. j − i + 1 k. 4. The i th cha
阅读全文
摘要:"Description" 思路 先求出最长的回文的前后缀,然后求每个最长回文区间能不能和前缀或后缀接起来,取接起来后长度最大的那个。 基本就是纯的马拉车算法了。就是要注意边界处理的细节,很容易出问题。我把前后缀的位置处理为开区间,回文区间为闭区间。这样边界相等就可以接起来。详见代码。
阅读全文
摘要:"Description" 思路 一开始dp列得乱七八糟,看了题解才知道原来可以设以每个位置为起点的期望。 设dp[i]为以位置i为起点期望天数。可得dp[i] = 1 + $p_i$dp[i] + $(1 p_i)$dp[1] dp[n + 1] = 0,答案为dp[1]。 推一推公式求出dp[1
阅读全文
摘要:"Description" 思路 首先根据奇偶性,0和2所在位置的奇偶性相同,1和3所在位置奇偶性相同。故0和2的个数与1和3的个数相同或相差1。如果不满足就NO。 由于3的左右两边必须是2;1的左右两边可以是0或2。所以先放3,计算所需的最少2的个数,如果2个数不够,就NO,否则把2放满3的左右两
阅读全文
摘要:"Description" 思路 先用dp打表发现x出现个数是按奇数和偶数分别降序。因此可以分开奇数偶数列分开二分。 事实上如果x是i的二进制前缀,那么x就可以通过f(i)获得,即x在i的path里。 所以x的出现个数就是小于等于n中以x为二进制前缀的个数。x为偶数时还要加上x+1的个数。细节详见代
阅读全文
摘要:"Description" 思路 题目中关键之处是必须先要把所有城堡都攻打下来,因此可以使用贪心。重要事实:对于城堡 i ,越到后面占领越好,因为越到后面兵力越足够。 每一个城堡对应一个它最远城堡,这样每一个城堡前面都有多个可占领的城堡。每攻打下一个城堡,就把能占领的城堡都占领了;当人手不够时,按照
阅读全文

浙公网安备 33010602011771号