摘要: 构造题, 交互题选做。还会选入一些其他妙妙题 阅读全文
posted @ 2021-02-02 20:49 duyiblue 阅读(2453) 评论(23) 推荐(12) 编辑
摘要: 只是站在一个前 oier 的个人角度整理了 AP Computer Science A 考试要注意的地方,比较适合有 OI 基础的读者,比如会 C++ 但没学过 Java,懂算法但没学过面向对象编程。祝大家考试顺利! 阅读全文
posted @ 2022-04-22 16:45 duyiblue 阅读(540) 评论(0) 推荐(1) 编辑
摘要: Kruskal 算法。考虑哪些边有可能被贪心选中。因为最小公倍数的要求太复杂、太苛刻,我们不妨忽略“最小”,只考虑是公倍数。因为这样新产生的边边权更大,不会影响答案。考虑点权是 k 的倍数的点之间的边,发现有用的边其中一个端点一定是大于等于 L 的第一个 k 的倍数。于是有用的总边数就被压缩到了 O(n log n) 级别。直接执行 kruskal 算法即可。此外,我们还可以不事先排序,用 priority_queue 把空间复杂度优化到 O(n)。 阅读全文
posted @ 2022-04-10 18:15 duyiblue 阅读(237) 评论(2) 推荐(1) 编辑
摘要: 先考虑 k 是偶数的情况,此时 k 必须是 2n 的约数,且不能是 n 的约数,并且 k 要尽量小,所以令 k = 2 的 (n 里 2 的最高次数 + 1) 次方即可。若 k 还是太大,说明偶数无解,考虑奇数。此时有一个非常巧妙的想法:令 k2 = 2n / k。会发现这个 k2 一定是满足条件的。 阅读全文
posted @ 2022-04-10 13:17 duyiblue 阅读(94) 评论(0) 推荐(1) 编辑
摘要: 从 i 向 b[i] + 1 连边,得到一棵树。考虑分层,问题转化为构造一个数组,使得每个节点的值小于父亲的值,但大于父亲同一层左边节点的值。在 dfs 离开一个节点时记录的 dfs 序就满足这个要求。 阅读全文
posted @ 2022-03-17 21:18 duyiblue 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 把所有位置按下标的奇偶性分类。考虑每个前缀里,两类位置上数的和之差。把对 h 的操作,变为对这个差序列的操作。操作变成了每次选一个小于 n 的位置,将它的值减 1。只要想清楚最终差序列的样子,就很容易求出合法差序列的数量了。 阅读全文
posted @ 2022-03-16 22:33 duyiblue 阅读(221) 评论(0) 推荐(1) 编辑
摘要: 首先,全局最大值一定是其中一个子序列的最大值,所以只需要考虑另一个子序列的最大值是几。根据这两个“最大值”,整个序列被划分为三段,前一段两个序列都递增,中间一增一减,第三段都递减。第一段和第三段可以用简单 DP 完成最优划分。中间段其实也可以用一个类似的 DP 来划分。DP 定义的关键是考虑与 i 不同的另一个子序列最后一个元素是几,转移时考虑 i 和 i - 1 在不在同一个序列中。 阅读全文
posted @ 2022-03-15 14:18 duyiblue 阅读(122) 评论(0) 推荐(1) 编辑
摘要: 分析题目性质,找出一些最基本的贪心策略(比如把 B 从小到大排序)。然后枚举总共获得了几个协作者,这样就能知道每个仅获得选票的州的用时,进而可以 DP。朴素的 DP 是 O(N^3) 的,总时间复杂度 O(N^4)。进一步观察问题特性后,可以把 DP 优化到 O(n^2)。 阅读全文
posted @ 2022-02-26 16:56 duyiblue 阅读(464) 评论(2) 推荐(3) 编辑
摘要: 退役后智商恢复 and 底层码农防失业。 阅读全文
posted @ 2022-01-26 22:58 duyiblue 阅读(371) 评论(3) 推荐(1) 编辑
摘要: 2021 年省队选拔全国 A 卷 354 分的成绩虽然在江苏省未能进入省队,但在全国总排名应该是不错的,且在绝大多数省份都可以入选省队。虽然我最终未能靠 OI 实现升学的目标,但读者如不嫌弃,可继续看我分享一点故事和经验。 阅读全文
posted @ 2021-06-13 23:43 duyiblue 阅读(13175) 评论(35) 推荐(36) 编辑
摘要: lcp 就是后缀树上的 lca。因为字符串随机,所以后缀树树高是 O(log n) 级别的。将询问离线,从小到大枚举 R,暴力跳祖先,更新一些 i 的答案。需要数据结构支持:前缀对一个值取 max,区间求和。发现要取 max 的值是 O(log n) 级别的,对每个值记录最大位置,就可以实现 O(1) 修改,O(log n) 查询。总时间复杂度 O(n log n)。 阅读全文
posted @ 2021-04-07 15:55 duyiblue 阅读(272) 评论(0) 推荐(1) 编辑
摘要: 分 b > d 和 b <= d 两种情况讨论。关于 b, d 做 cdq 分治。每次考虑右边对左边的贡献,这样 b, d 的大小关系就解决了。第一种情况比较简单,就是在可持久化 01 trie 里查询一下就行了第二种可以考虑每个 b 对 d 的贡献,方法就和第一种情况差不多了,也就是把“查询”改成“打标记”。 阅读全文
posted @ 2021-03-27 15:17 duyiblue 阅读(2568) 评论(9) 推荐(8) 编辑
摘要: 用总数减去不合法的排列数。考虑不合法的排列里的极长不合法段,那么不合法的排列可以分为两类:有两个极长不合法段的,或者有三个及以上极长不合法段的。对于前者,发现至少有一个不合法段是前缀或后缀,且数值为 1...k,可以递推求出其方案数(二次容斥)。对于后者,不合法段一定不相交。考虑用 DP 对齐进行划分,再用前面处理好的答案算出其排列方案数。 阅读全文
posted @ 2021-03-25 23:18 duyiblue 阅读(197) 评论(0) 推荐(1) 编辑
摘要: 首先把问题转化为:有一个给定的数组 b[1...n],一个数 x,使得所有 (b[i] + x) 的二进制里 1 的个数之和最小。从低到高逐位 DP,发现要考虑上一位有没有进位,那么状态数是 2^n 的。进一步观察,因为每个数加的 x 是一样的,所以在这些低位上原数值越大,越有可能进位。所以状态里只需要记录有多少个数进位,然后把序列排个序,就知道具体是哪些数进位了 阅读全文
posted @ 2021-03-25 23:12 duyiblue 阅读(206) 评论(0) 推荐(0) 编辑
摘要: 本文提供了两种解法。一种是硬核数据结构做法。将限制转化为一个几何问题(双矩形的交),用扫描线求解。第二种是巧妙的贪心,证明了如何选择 n1, n2 是最有可能有解的,于是在确定 n1, n2 后,直接进行二分图染色即可 阅读全文
posted @ 2021-03-16 17:37 duyiblue 阅读(197) 评论(1) 推荐(1) 编辑
摘要: 以第一个关键节点为根。根据:v 在 x, y 的路径上,当且仅当 dis(v, x) + dis(v, y) = dis(x, y),可以确定每个关键点到根的路径。接下来按深度从小到大加入剩余的节点。只需要在已经确定的部分里为它找到一个父亲即可 阅读全文
posted @ 2021-03-15 13:09 duyiblue 阅读(235) 评论(2) 推荐(0) 编辑