随笔分类 - 题解
1
摘要:注意到,要求一个值域是 的序列的子段和有多少种不同的取值,实际上就是求它的最小子段和 到最大子段和 之间有多少个整数。因为可以证明,每个处于 中的数,都至少有一个子段与之对应——要得到和为 的子段
阅读全文
摘要:C - 11/22 Substring 枚举每个 /,从 / 出发向左右两边扩展到最远。因为每个点最多能被访问一次(向右只扩展 2,向左只扩展 1),复杂度为 。 int ans = 0; for (int i = 0; i < n; i++) { if (s[i] != '/')
阅读全文
摘要:C - Kaiten Sushi 把寿司都放到一个堆里,从前往后扫 数组,如果当前食客 小于等于堆顶,就取出堆顶,记录这份寿司被第 个人吃掉。复杂度 。 D - Keep Distance 搜索回溯,但每一步从 枚举到
阅读全文
摘要:B. Shohag Loves Strings 注意到两个相同字母 aa 的 为偶数,所以如果找到两个相邻相同字母输出即可。如果没有相邻相同的两个字母,则说明字符串相邻的字母一定不同,再考察三个相邻的字母的情况,发现三个字母均不同,如 abc 时 也为偶数,又找到
阅读全文
摘要:A. lz的吃饭问题 print("lz" if (lambda a,b: a*b)(*map(int, input().split())) < (lambda a,b: a*b)(*map(int, input().split())) else "gzy") B. lz的数字问题 把数字按字符串处
阅读全文
摘要:传送门。显然可以 地找到 所属的 段,所以我们只需要得到 即可。不难发现,删除元素的规则应该是从 到 枚举每个元素,删除它前面“紧邻的”比他大的元素(例如对于 eadcb 中的 b 删除掉 dc)。 赛时一直在
阅读全文
摘要:传送门。每个数作为最大值时的贡献显然是 , 为 在多少种染色方案中作为最大值出现,我们主要来对每个数求 。 我们对于从 到 枚举元素,求出它和能被它染成绿色的所有元素中的最大值 \(mx
阅读全文
摘要:方法一:差分 因为是先修改后查询,很容易想到差分,但因为数据值域 过大,所以不能使用差分数组,而应用 map 进行存储,如代码所示: map<int, int> diff; // 正常进行差分操作 for(auto& f : flowers) diff[f[0]]+
阅读全文
摘要:异或和按位处理的典型例题。要求所有子区间异或和乘区间长度的总和,朴素的方法是 地枚举区间,显然无法通过。 因为涉及异或和,而异或运算不进位,故自然地想到把 写成二进制形式,单独研究每一位的贡献,最后再合并。这是处理此类问题的一般思路。 1. 二进制拆分 比方说,
阅读全文
摘要:基环树上的“追及相遇”问题。 考虑什么情况下,Valeriu 能“无限期”地从 Marcel 手中逃离。参考样例 1,我们发现当 Valeriu 进入基环树的环中,他总能通过预判,逃往 Marcel 的反方向,避免被抓;而如果两者都在子树中,Marcel 就能步步紧逼,将 Valeriu 堵在叶子结
阅读全文
摘要:传送门。要求使得区间和小于 的子区间长度,显然可以二分处理。二分区间长度,枚举区间左端点,check 两项内容:区间是否合法(符合 ),区间和是否小于 。对于当前区间长度,只要有一个区间满足条件,即返回真。 区间和可以通过前缀和 \
阅读全文
摘要:考查异或的基本性质。 对于操作2,用两个变量 记录 位置的异或和,在查询时直接输出即可。那么,在操作 1 如何更新 ? 如果操作 1 只改变一个数,比如将 从 改为 ,那么我们只需将 \(a_
阅读全文
摘要:传送门。博弈论问题基本思路是先确定“状态”,即先手必胜或者先手必败。这里定义“必胜/必败”为走到当前格子的人的结局(赛时因为搞混了走入的人和走出的人,导致浪费大量时间)。 不难发现,一个位置是“必胜”还是“必败”完全取决于它前面的位置——如果前面有(能合法走入的)“必胜位置”,则当前位置一定是“必败
阅读全文
1