摘要: 分析 手玩样例发现连一条边实际上是将一个多边形分割成两个部分,而且不能在这两个部分直接连边,发现这两个部分是完全独立的,于是考虑区间 DP。 设状态 \(f_{l,r}\) 表示将 \([l,r]\) 区间连成树的方法数量。 那么存在两种转移,一种是 \(l,r\) 间不直接连边,这样中间的点都需要 阅读全文
posted @ 2023-10-26 20:44 Kazdale 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 分析 看到 \(n \leq 35\) 的数据范围就想到了 meet-in-middle。 先爆搜出对于 \(1 \sim \frac{n}{2}\) 和 \(\frac{n}{2} \sim n\) 两个下标范围内在模意义下所有的和。 然后用一个常见 trick,就是枚举第二个部分的和,然后匹配第 阅读全文
posted @ 2023-10-26 15:15 Kazdale 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 分析 很容易想到从 \(0\) 开始枚举 \(a_i \neq i\) 的位置个数一直枚举到 \(k\) 计算每种情况下的答案加在一起即为答案。 对于 \(k\) 确定的情况,\(a_i = i\) 的位置共有 \(C_{n}^{n-k}\) 种情况,剩下的位置要保证 \(a_i \neq i\)。 阅读全文
posted @ 2023-10-26 11:18 Kazdale 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 分析 容易想到可以枚举每个字母,分别求其最小 \(k\) 取 \(\min\)。 思考对于一个 \(k\),如何判其不合法。容易想到如果存在一个没有这个字符的长度大于等于 \(k\) 的子段,那么这个 \(k\) 就不合法。 那么我们就知道如何求最小合法 \(k\) 了。找到最长的没有这个字符的子段 阅读全文
posted @ 2023-10-26 10:34 Kazdale 阅读(170) 评论(0) 推荐(0) 编辑
摘要: 分析 题意为选出最多的操作使机器人执行完仍停留在原地。 分为左右和上下两类,则每一类的可执行操作数都是操作次数最少的一种操作的二倍(因为正反操作都要执行才能抵消)。 直接统计每种操作的操作次数计算答案即可。 代码 #include <iostream> using namespace std; co 阅读全文
posted @ 2023-10-26 10:00 Kazdale 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 分析 因为一个数不可能同时大于并小于它两边的数,所以两种数的集合不存在交集。 所以分别扫一遍两种数的个数加在一起即可。 代码 #include <iostream> using namespace std; constexpr int MAXN(1000007); int a[MAXN]; int 阅读全文
posted @ 2023-10-26 09:18 Kazdale 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 分析 观察到题面是求最小极差,想到 two-pointers。 按 \(w_i\) 大小排序,然后发现一个子段的子段的答案肯定不优于原子段。 和CF1777C以及NOI2016区间一样,选取合法左端点然后选取最大合法右端点。 值得注意的是,本题要求首尾相接,所以为了避免选取的线段无交集,将 \(r\ 阅读全文
posted @ 2023-10-26 08:58 Kazdale 阅读(173) 评论(0) 推荐(0) 编辑