杂题瞎做[9,10月]
学 OI,让我患上了,\(\huge\color{red}\text{鱼鱼蒸}\)。
P2751
记 \(th_k(A)\) 表示序列 \(A\) 的第 \(k\) 小元素。
咱们假设 \(\max(a_i + b_i) \le C\),即假设 \(B\) 在 \(C\) 时间做逆操作,第 \(i\) 个工件于 \(u_i\) 时刻做完,原问题解存在当且仅当 \(\forall i, t_i \le u_i\)。若要尽可能满足该条件,则需使得 \(t_i\) 小的配对小的 \(u_i\),问题被拆分成两个相似的问题,即单纯地考察 \(A\) 的问题。当 \(C\) 取得最小值时,\(th_k(t)\) 与 \(th_k(u)\) 匹配,若 \(C \leftarrow C + \Delta C\),则 \(u_i \leftarrow u_i + \Delta C\),\(\min(u_i - t_i + \Delta C) = \min(u_i - t_i) + \Delta C = 0\) 即 \(\Delta C = \max(t_i - u_i)\),考虑求出 \(C = 0\) 时的 \(u\) 即可。
P3045
神奇小题目。
首先咱们注意到,假定已经确定被购买的奶牛的集合 \(S\),则必然存在一个最优解,使得 \(S\) 中 \(P_i - C_i\) 前 \(k\) 大的奶牛使用了优惠券,证明如下:
\(\qquad\) 假设使用优惠券的集合为 \(S'\),\(|S'| = k\),则花费为:
\(\qquad\) 其中 \(\sum_{i \in S} P_i\) 为定值,则 \(\sum_{i \in S'} (P_i - C_i)\) 需最大,即 \(S\) 中 \(P_i - C_i\) 前 \(k\) 大的在 \(S'\) 中。
现在咱们假设 \(S = \{1, 2, ..., N\}\),调整 \(S\) 使得其最小花费 \(\le m\),考虑从 \(S\) 中删除一个元素 \(x\) 对最小花费的贡献:
- \(x \notin S'\),则最小花费减小 \(P_x\)。
- \(x \in S'\),此时 \(x\) 被删除后,满足 \(P_i - C_i\) 最大的 \(i\ (i \notin S')\) 被并入 \(S'\),则最小花费减小 \(C_x + P_i - C_i\)。
则欲使最终 \(|S|\) 最大,则需要每次选取对最小花费减小的贡献最大的 \(x\) 删除,即删除 \(\max_{x \notin S'} P_x\) 或 \(\max_{x \in S'} C_x + \max_{i \notin S'}(P_i - C_i)\),证明:我不会(跑。
P1084
形式化题意:给定有根带权树 \(T\),若一质点在 \(T\) 的一个节点上,则该质点可以沿任一与该点邻接的一条边移动,现在给出点集 \(S\),初始状态下 \(S\) 中的点上各有一个质点,求在使得任一 \(T\) 的根到其叶子的路径上都存在至少一个质点的条件下各质点路程的最大值的最小值。
设第 \(i\) 个质点的路径长为 \(x_i\),假定 \(\max_{i \in S} x_i \le C\),则 \(\forall i \in S, x_i \le C\),原问题转化为求 \(C\) 的最小值。此时显然对于每个点,向其儿子方向走必然不优,则需要让每个点都走到其能够走到的深度最小的点。
显然对于任意点,若该点在 \(C\) 的约束下无法跨过根节点,则该点最终必然停留在其能够到达的深度最小的点;对于在 \(C\) 约束下可以跨过根节点的点咱们需要单独考虑。
咱们考虑建立二分图,其左侧点集 \(S_1\),右侧点集 \(S_2\)。\(S_1\) 中每个点表示一个可跨过根节点的点,\(S_2\) 中每个点表示一个由所有不可跨过根节点的点无法分离根节点到该点的子树中的所有叶子的点(且该点为根节点的儿子),对于 \(x \in S_1\),\(y \in S_2\),若 \(x\) 可达 \(y\),则在 \(x\) 与 \(y\) 中连一条边,则此时有解当且仅当该二分图存在一个 \(|E| = |S_2|\) 的匹配,然后不会了。
多想性质!
咱们记 \(f_i\) 表示第 \(i\) 个可跨过根节点的点到达根节点时剩余的可走的长度,\(T_i = \{u | w_{1, u} \le f_i\}\),\(p_i\) 表示第 \(i\) 个可跨过根节点的点初始时在 \(p_i\) 点的子树内(\(p_i\) 是根节点的儿子),则 \(\forall i \neq j, f_i \le f_j, T_i \subset T_j\),\(T_i \cup \{p_i\}\) 为点 \(i\) 真实能够运动到的点,考虑模拟费用流。
-
若只考虑 \(T_i\) 所形成的边,则该图上不存在撤流操作。
证明:模拟 EK 算法,若点 \(i\) 撤了 \(j\) 的流(\(f_i \ge f_j\)),则 \(i\) 可以不通过撤流流向相同点。
-
若 \(p_i \notin T_i\),则必然先流 \(i \rightarrow p_i\)。
证明:若流 \(i \rightarrow x\)(\(x \neq p_i\)),则该边后续会被 \(q \rightarrow x \rightarrow i \rightarrow p_i\) 撤掉。
所以这题做完了。
CF1271D
注意到如果存在边 \((i, j)\),则在 \(i\) 处选取必然不优,设 \(f_{i, j}\) 表示前 \(i\) 个中选取 \(j\) 个的最大价值,则有:
其中 \(\sum c_q\) 表示 \(i\) 处可达的前 \(k\) 大的 \(c\) 之和。
CF980D
咱们考虑对每个 \(a_i\) 除去其偶数次质因子,得到 \(b_i\),则原问题转化为划分 \(b\) 的等价类,\(a\) 的任意子串的答案即为其对应 \(b\) 的值域。
设 \(f_r(x)\) 表示 \(b_x\) 到 \(b_r\) 的值域大小,假设 \(b_1\) 到 \(b_r\) 最后一个与 \(b_{r + 1}\) 相等的元素为 \(b_k\),则 \(\forall x \in [k + 1, r], f_{r + 1}(x) \leftarrow f_r(x) + 1\),\(\forall x \in [1, k], f_{r + 1}(x) \leftarrow f_r(x)\),\(f_{r + 1}(r + 1) \leftarrow 1\)。
然后高贵地暴力统计,收获高贵的 \(O(n^2)\)。
但是,这个做法是假的!因为 \(0 \times a = 0\),所以咱们需要考虑的是除去 \(0\) 后的值域,因此当 \(b_{r + 1} = 0\) 时是无贡献的,且对于 \(b_{r + 1} \neq 0\) 时,其对于全 \(0\) 区间 \([p, r]\) 是无贡献的,然后就做完了。
CF930C
咱们注意到可以判断无解的条件是 \(c_i\) 非先增后减,则原问题转化为求出一个最大集,使得其先增后减。
记 \(f_i\) 表示以 \(i\) 结尾的最长上升子序列,\(g_i\) 表示以 \(i\) 开头的最长下降子序列,求出 \(\max_{l < r} f_l + g_r\) 即可。
CF1265E
考虑有向图
其中 \(i \rightarrow i + 1\) 的边赋有概率 \(p_i\),\(i \rightarrow 1\) 的边赋有概率 \(1 - p_i\),原问题转化为求从 \(1\) 到 \(n + 1\) 的期望长度,则可以记 \(E_i\) 表示从 \(i\) 到 \(n + 1\) 的期望长度,记 \(P_i\) 表示从 \(i\) 到达 \(n + 1\) 的概率,设 \(\Omega_i\) 表示从 \(i\) 到 \(n + 1\) 的全部路径,\(|X|\) 表示路径 \(X\) 的长度,\(P(X)\) 表示在 \(X\) 的起点处走完 \(X\) 的概率,则有:
注意到 \(p_iP_{i + 1} + (1 - p_i)P_1 = 1\),则 \(E_i = p_iE_{i + 1} + (1 - p_i)E_1 + 1\),\(E_{n + 1} = 0\),咱们狠狠求通项,解得 \(E_n = E_1 - \sum_{i = 1}^{n - 1} (\prod_{j = i}^{n - 1} p_j)^{-1}\),即 \(E_1 = \sum_{i = 1}^{n} (\prod_{j = i}^{n} p_j)^{-1}\),这玩意不是随便做?
双倍经验 P6835。
CF156C
字符串可以视为数列,两个字符串等价当且仅当其对应数列的和相等,则原问题转化为整数分拆问题。
CF1106E
注意到任意时刻的决策都是确定的,设 \(f_{i, j}\) 表示 \([1, i)\) 的时间内完成了 \(j\) 次干扰所得到的最小值,\(h_i\) 表示在 \(i\) 时刻的决策对应的时间,\(w_i\) 表示在 \(i\) 时刻的决策对应的价值,则:
\(ans = \min_{j = 0}^m f_{n + 1, j}\)。
CF900D
咱们记 \(b_i = \frac{a_i}{x}\),则 \(b_i \in \mathbb{N}\),\(\sum_{i = 1}^n b_i = \frac{y}{x}\),\(\gcd(b_1, b_2, \cdots, b_n) = 1\),故有解的必要条件为 \(x | y\)。
记 \(f_i\) 表示和为 \(i\) 的最大公因数为 \(1\) 的数列个数。若不考虑最大公因数的限制,则数列个数为 \(2^{i - 1}\),则有:
则有
显然只有 \(\frac{y}{x}\) 的约数会被计算到,\(O([d(\frac{y}{x})]^2 \log \frac{y}{x})\)。
CF1271E
条件长得非常像拆位,考虑二进制形式,可以发现 \(y \in path_j\) 的充要条件为:
- \(y_{(2)}\) 是 \(j_{(2)}\) 的一段前缀。
- \(y_{(2)}\) 是 \(j_{(2)}\) 的一段真前缀的末尾补上一个 \(0\)。
欲求 \(x\) 的 \([1, n]\) 中以 \(x\) 为前缀的数的个数,可分一下两种情况讨论:
- 最高位不与 \(n\) 对齐,则钦定前缀,后若干位乱选,贡献 \(2^{p_1 - p_2} - 1\)(\(n\) 有 \(p_1\) 位,\(x\) 有 \(p_2\) 位)。
- 最高位与 \(n\) 对齐,若对齐后比 \(n\) 前缀大则贡献 \(0\);与 \(n\) 的前缀相等则贡献 \(x\) 的后 \(p_1 - p_2\) 位的数 \(+ 1\);比 \(n\) 的前缀小则乱选,贡献 \(2^{p_1 - p_2}\)。
咱们分别对前缀与真前缀末尾补 \(0\) 二分即可。
CF840B
这么困难/jk
先考虑树怎么做,显然对于叶子,与其关联的边是否保留是确定的,然后就做完了。
然后考虑图,显然对于任意图 \(G\),都有正规支撑树 \(T\),注意到有解的必要条件为存在偶数个点的约束为 \(d_i = 1\),猜测该条件为充要条件,考虑如何构造解:直接把 \(T\) 抽出来按树做,注意到每次选中 \(T\) 的叶子后钦定其到父节点的边是否选中对 \(d_i = 1\) 的点的个数的贡献为 \(\{0, -2\}\),同时对于 \(|T| = 2\) 的满足条件的 \(T\) 是有平凡解的,因此可做数学归纳,故必然能够构造一组合法解。
CF128C
简单数数题,考虑将矩形的顶点坐标拆开,用形如 \((x_1, x_2), (y_1, y_2)\) 的方式刻画一个矩形,则答案即为从 \(n - 1\) 个 \(x\) 坐标中选出 \(2k\) 个的方案与从 \(m - 1\) 个 \(y\) 坐标中选出 \(2k\) 个的方案积,即:
CF16E
怎么又是概率,我要生气了111!
咱们设 \(S\) 表示当前仍然存活的于,\(P_S\) 表示从 \([n]\) 转移到 \(S\) 的概率,则有:
暴力转移就行,收获高贵的 \(O(n^22^n)\) 复杂度。
CF786A
怎么这么像过河卒。
形式化题面:给出一个正整数 \(x \in [2, n]\),两名玩家每人有一个数集,每轮可以从数集中选出一个数 \(p\),使得 \(x \leftarrow 1 + (x + p - 1) \mod n\),当某位玩家操作后使得 \(x = 1\) 时,该玩家获胜,求出先手必胜或后手必胜或游戏无法停止。
考虑博弈论经典小结论,倒着更新状态即可。
CF621E
一眼数位。
记 \(f_{i, j}\) 表示前 \([0, i - 1]\) 能够组成多少方案不同的模 \(k\) 等于 \(j\) 的数,则有:
但是 \(b \le 10^9\),爆!考虑矩阵快速幂优化:
考虑把所有 \(i\) 相同的状态放一块转移,对任意 \(j \in [0, x)\),\(k \in [1, n]\),令 \(A_{(10j + a_k) \mod x, j} \leftarrow A_{(10j + a_k) \mod x, j} + 1\),则 \(A\) 为转移矩阵,狠狠快速幂即可,\(O(x^3 \log b)\)
CF351B
最神秘的一集。
记 \(f_i\) 表示 \(p\) 中存在 \(i\) 个逆序对时到达升序状态的期望步数,则:
当 \(i\) 为偶数时:\(f_i = 4j + f_{i - 2j} = 2i\);当 \(i\) 为奇数时:\(f_i = 4j + f_{i - 2j} = 2i - 2 + f_1 = 2i - 1\)。
使用树状数组维护逆序对即可。
CF963B
有解的必要性条件:\(|E|\) 为偶数且存在一个点的 \(d \equiv 0 (\mod 2)\),证明显然。
记 \(f_u\) 表示将以 \(u\) 为根的子树全部删除是否需要先删除边 \((u, fa_u)\),\(r\) 为树根,则有:
若 \(f_u = 1\),则说明需要先删除 \(fa_u\),建立有向边 \(fa_u \rightarrow u\);若 \(f_u = 0\),则说明需要先删除 \(u\),建立有向边 \(u \rightarrow fa_u\),最后其拓扑序即为答案。
CF1359E
结论 1:若 \(\exists q \neq 1\),$ a_1 \perp a_q$,则该序列不合法。
证明:注意到条件 3 的等式左边为 \(x \mod a_1\),令 \(x = a_q\), \(p_1 = q\),则左侧 $ = a_q \mod a_1$,右侧 \(= 0\),若 \(a_1 \perp a_q\),则条件不满足。
故条件满足的必要条件为:\(\forall q\),\(a_1 \mid a_q\)。
同时,该条件为充分条件(证明显然),故答案为 \(\sum_{i = 1}^n \binom{\lfloor\frac{n}{i}\rfloor - 1}{k - 1}\)。
P2607
将矛盾关系连有向边,每个点赋点权,则原问题转化为图 \(G\) 的最大权独立集。
注意到图 \(G\) 有如下性质:
- \(\forall i \in V\),\(d^-_i = 1\)。
- 若一个 \(G\) 的连通分量中存在一个环 \(C\),则该联通分量中的点 \(x\) 到 \(C\) 只有一条有向路径,且该路径为 \(x \rightarrow C\)(1. 的推论)。
- 若一个 \(G\) 的连通分量中存在一个环 \(C\),则该连通分量形如内向基环树(2. 的推论)。
- 图 \(G\) 的任意连通分量形如一棵内向基环树(3. 的推论)。
将所有有向边改为无向边,则 \(G\) 为若干基环树的无交并,考虑钦定环上的点 \(x\) 是否被选入独立集,然后断环成树。
P3177
定义 \(f_{i, j, c}\) 表示子树 \(i\) 内选中了 \(j\) 个点作为黑点,且已经合并前 \(c\) 棵儿子的子树时,子树 \(i\) 内所有边的带权最大和。
咱们考虑交换求和顺序,考虑每条边被计算多少次,对于边 \((x, fa_x)\),若 \(x\) 子树内有 \(j\) 个黑点,则其被计算了
次,令 \(p_{x, j}\) 等于上式,则有转移方程:
其中 \(r_{x, i}\) 表示点 \(x\) 的第 \(i\) 个儿子,\(t_x\) 表示点 \(x\) 的儿子个数。
P4395
注意到:解取到最优的必要条件为权值在 \(\mathbb{N}\) 上连续。
记 \(f_{i, j}\) 表示以 \(i\) 为根的子树内,点 \(i\) 的权值取到 \(j\) 时的最小权值和,则有:
待证:\(j \le 8\)。
P4516
记 \(f_{i, j, c, 0/1, 0/1}\) 表示 \(i\) 与 \(i\) 的前 \(c\) 个儿子的子树之并中,共染了 \(j\) 个点的色,使得点 \(i\) 被覆盖 / 不被覆盖,点 \(i\) 染色 / 未染色,且该结构中除 \(i\) 外的任意点均被覆盖的约束下的染色方案数。则有:
答案即为 \(f_{1, k, t_1, 1, 0} + f_{1, k, t_1, 1, 1}\)。
P3287
形式化题意:给定正整数序列 \(a\),可以对 \(a\) 做至多 \(K\) 次操作,每次操作都可以选定区间 \([l, r]\),并使得 \(\forall i \in [l, r]\),\(a_i \leftarrow a_i + 1\),求最终序列的最长不下降子序列长度的最大值。
咱们假定存在一个最优解,其最终选中的不下降子序列的下标为:\(\{i_1, i_2, \cdots, i_p\}\),第 \(j\) 次的操作为 \([L_j, R_j]\)。则咱们构造一个新的操作序列,使得其第 \(j\) 次操作为 \([L_j, n]\),则相当于在原始操作的基础上对 \((R_j, n]\) 做了一次操作,咱们记 \(\delta_i\) 表示第 \(i\) 个元素相对于原始操作的值的变化量,注意到若 \(a_q\) 被 \(\delta_q\) 个区间 \((R_j, n]\) 覆盖,则 \(a_{q + 1}\) 也被这 \(\delta_q\) 个区间覆盖,故有:
因此,对于 \(i_q\) 和 \(i_{q + 1}\),\(a'_{i_q} + \delta_{i_q} \le a'_{i_{q + 1}} + \delta_{i_{q + 1}}\),即原始操作得到的最长不下降子序列在新的操作序列下仍为不下降子序列,故必然存在一个最优解,使得 \(R_j = n\)。
于是咱们记 \(f_{i, j}\) 表示前 \(i\) 个数中取了 \(j\) 个数作为左端点时,以 \(i\) 结尾的最长不下降子序列的长度,则有:
故 \(f_i(j)\) 单调不降,则可改写该式:
咱们考虑如何维护上式中的 \(\max_{k < i \land a_k \le a_i} f_{k, j}\) 和 \(\max_{k < i \land a_k > a_i} f_{k, a_i - a_k + j}\),咱们定义两个矩阵 \(A\),\(B\),每次求出一个 \(f_{i, j}\) 则令 \(A_{j, a_i} \leftarrow \max\{A_{j, a_i}, f_{i, j}\}\),\(B_{a_i + j, a_m - a_i + 1} \leftarrow \max\{B_{a_i + j, a_m - a_i + 1}, f_{i, j}\}\),则有:
其中 \(a_m\) 表示 \(a_i\) 的最大值,每行 \(A\),\(B\) 都维护一个数据结构,支持单点修改与区间最大值查询即可,复杂度 \(O(NK \log (K + V))\),其中 \(V\) 为 \(a_i\) 的值域,答案即为 \(\max_{i \in [1, n]} f_{i, k}\)。
P2605
神秘喵喵题。
首先咱们有一个显然的 dp,记 \(f_{i, j}\) 表示若前 \(i\) 个点的决策确定,且选定第 \(i\) 个点建立基站,此时一共设置了 \(j\) 个基站的最小花费,则有:
咱们记能够覆盖点 \(i\) 的最左侧点为 \(L_i\),最右侧点为 \(R_i\),则 \(w(k, i) = \sum_{L_j > k \land R_j < i} W_j\),咱们现在固定 \(j\),只考虑 \(i\) 的转移。记 \(v_i(k) = f_{k, j - 1} + w(k, i)\),则 \(f_{i, j} = \max_{k < i} v_i(k)\),\(f_{i + 1, j} = \max_{k < i + 1} v_{i + 1}(k)\)。
咱们考虑在转移 \(i\) 的时候 \(v_i\) 的变化,考察 \(v_{i + 1}(k)\) 与 \(v_i(k)\) :
咱们记 \(S_i = \{j | R_j = i\}\),则 \(v_{i + 1}(k) = v_i(k) + \sum_{L_j > k \land j \in S_i} W_j\)。根据上面这个式子,咱们可知对于一个 \(W_j\)(\(j \in S_i\)),它被所有 \(v_{i + 1}(k)\)(\(k < L_j\))都加了一次,即序列 \(v_{i + 1}\) 可由 \(v_i\) 做若干次区间加得到,每次对区间 \([1, L_j - 1]\) 加上 \(W_j\)。而此时 \(f_{i, j} = \max_{k < i} v_{i}(k)\),则相当于对于序列 \(v_i\) 查询其区间 \([1, i - 1]\) 的最小值。最后咱们发现 \(v_i\) 不参与后续求得 \(f_{i', j}\)(\(i' > i\))的过程,故可以直接舍去 \(v_i\) 的第一维,每次直接对原序列操作。最终咱们做了 \(n\) 次区间加与 \(n\) 次区间求最小值,对于每个 \(j\) 将所有 \(i \in [1, n]\) 的 \(f_{i, j}\) 求出的时间复杂度为 \(O(n \log n)\)。
现在咱们考虑如何转移 \(j\),每次 \(j\) 发生转移,咱们只需要考虑如何求出 \(f_{1, j}\) 即可,即给定一个新的 \(j\) 下的 \(v\)。直接根据 \(v\) 的定义 \(v(k) = f_{k, j - 1} + c(k, 1) = f_{k, j - 1}\)(此时 \(i = 1\))求得即可。
最终时间复杂度 \(O(kn \log n)\)。
P5664
EZEZEZ
咱们考虑一个 \(n\) 行 \(m\) 列的矩阵 \(A\),每个点有 \(A_{i, j}\) 种不同的染色方法,要求求出满足下列约束的不同的染色方案数:
- 至少有一个点染色。
- 每行至多一个点染色。
- 每列至多染上 \(\lfloor \frac{k}{2} \rfloor\) 个点(整个矩阵染了 \(k\) 个点)。
注意到不可能存在两个及两个以上的列同时被染上 \(> \lfloor \frac{k}{2} \rfloor\) 个点,因此可以钦定 \(> \lfloor \frac{k}{2} \rfloor\) 的列后算出满足 1. 2. 但不满足 3. 的方案数。
假设钦定列 \(R\) 不满足 3. ,记 \(f_{i, j}\) 表示对于前 \(i\) 行,在列 \(R\) 上的被染色点数 \(c_1\) 与不在列 \(R\) 上的被染色点数 \(c_2\) 满足条件 \(c_1 - c_2 = j\) 时的方案总数,则有:
易知满足 1. 2. 的方案总数为:
答案即为 \(\prod_{i = 1}^n (1 + \sum_{j = 1}^m A_{i, j}) - \sum_{L = 1}^m \sum_{i > 0} f_{n, i}^{(L)} - 1\),预处理每行 \(A\) 的和即可做到 \(O(n^2 m)\)。
P7075
假设今天是 \(A\) 年 \(B\) 月 \(C\) 日,该日到公元前 \(4713\) 年 \(1\) 月 \(1\) 日有 \(D\) 天,则容易得到:
其中,\((1)\) 适用于公元前,\((2)\) 适用于公元后的儒略历,\((3)\) 适用于格里高利历 \(1582\) 年内,\((4)\) 适用于格里高利历 \(1583\) 年及以后,\(S_x\) 表示前 \(x\) 月的天数之和 \(-1\)(注意对于平年和闰年的 \(S\) 是不同的,上述式子中的 \(S\) 均取决于 \(A\) 的值)。注意到 \(D\) 关于时间单增,所以对于方程 \(D = r\) 可以分别二分 \(A\) 和 \(B\) 以得出方程的解,即通过儒略日反推日期。
下面给出其推导过程:记 \(A, B, C\) 表示 \(A\) 年 \(B\) 月 \(C\) 日。
\((1)\). 考虑先算 $4713, 1, 1 $ 到 \(A, 1, 1\):共经过 \(4713 - A\) 年,且公元前 \(1\) 年到前 \(r\) 年共 \(\lfloor \frac{r + 3}{4} \rfloor\) 次闰年,故共经过了 \(\lfloor \frac{4713 + 3}{4} \rfloor - \lfloor \frac{A + 3}{4} \rfloor = 1179 - \lfloor \frac{A + 3}{4} \rfloor\) 次闰年。再考虑计算 \(A, 1, 1\) 到 \(A, B, C\):共经过前 \(B - 1\) 月和 \(C\) 天,即 \(S_{B - 1} + C\),故 \(D = 1179 + 365(4713 - A) - \lfloor \frac{A + 3}{4} \rfloor + S_{B - 1} + C\)。
\((2)\). 考虑先算 \(1, 1, 1\) 到 \(A, 1, 1\):共经过 \(A - 1\) 年,且公元 \(1\) 年到 \(r\) 年共 \(\lfloor \frac{r}{4} \rfloor\) 次闰年,故共经过了 \(\lfloor \frac{A - 1}{4} \rfloor\) 次闰年。再考虑计算 \(A, 1, 1\) 到 \(A, B, C\):同上可知为 \(S_{B - 1} + C\)。最后计算 \(4713, 1, 1\) 到 \(1, 1, 1\):直接套 \((1)\) 式,可知为 \(1721424\),故 \(D = 1721424 + 365(A - 1) + \lfloor \frac{A - 1}{4} \rfloor + S_{B - 1} + C\)。
\((3)\). 考虑先算 \(1582, 10, 15\) 到 \(1582, B, C\),同上可知为 \(S_{B - 1} + C - S_9 - 15\)。再计算 \(4713, 1, 1\) 到 \(1582, 10, 15\):直接套 \((1)\),\((2)\) 式可知为 \(2299161\),故 \(D = 2299161 + S_{B - 1} + C - S_9 - 15 = 2299146 - S_9 + S_{B - 1} + C\)。
\((4)\). 考虑先算 \(1583, 1, 1\) 到 \(A, 1, 1\):咱们记 \(d_1\) 表示 \([1583, A - 1]\) 中 \(4\) 的倍数的个数,\(d_2\) 表示 \([1583, A - 1]\) 中 \(100\) 的倍数的个数,\(d_3\) 表示 \([1583, A - 1]\) 中 \(400\) 的倍数的个数。可知:闰年个数为 \(d_1 + d_3 - d_2\)。易知 \(d_1 = \lfloor \frac{A - 1}{4} \rfloor - \lfloor \frac{1582}{4} \rfloor = \lfloor \frac{A - 1}{4} \rfloor - 395\),\(d_2 = \lfloor \frac{A - 1}{100} \rfloor - \lfloor \frac{1582}{100} \rfloor = \lfloor \frac{A - 1}{100} \rfloor - 15\),\(d_3 = \lfloor \frac{A - 1}{400} \rfloor - \lfloor \frac{1582}{400} \rfloor = \lfloor \frac{A - 1}{400} \rfloor - 3\)。再考虑计算 \(4713, 1, 1\) 到 \(1583, 1, 1\):直接套 \((1)\),\((2)\),\((3)\) 式可知为 \(2299239\),故 \(D = 2299239 + 365(A - 1) + \lfloor \frac{A - 1}{4} \rfloor - 395 + \lfloor \frac{A - 1}{400} \rfloor - 3 - \lfloor \frac{A - 1}{100} \rfloor + 15 = 2298856 + 365(A - 1) + \lfloor \frac{A - 1}{4} \rfloor + \lfloor \frac{A - 1}{400} \rfloor - \lfloor \frac{A - 1}{100} \rfloor\)。
综上得到上式。
P7077
非常喵题目,使我的滨州发光旋转。
首先直接模拟这个过程肯定是没有前途的,想要降低复杂度只能考虑拆开每个操作的贡献。
一般地,咱们可以认为一个数据 \(a_i\) 最终会长成:\(c_r + m_r(\cdots m_3(c_2 + m_2(c_1 + m_1 a_1)))\) 这样的形态,其中 \(m_r\) 表示第 \(r\) 次乘法操作,\(c_r\) 表示第 \(r\) 次加法操作,咱们考虑把这个式子拆开:
即对于 \(c_i\) 有系数 \(\prod_{j = i + 1}^r m_j\)。
建立一个有向图 \(G\) 来表示函数的调用过程,若函数 \(F_i\) 依次调用了 \(F_{g_1}\),\(F_{g_2}\),\(\cdots\),\(F_{g_c}\),则分别连接边 \(i \rightarrow g_d\)(\(d \in [1, c]\)),那么这张图 \(G\) 是一张 DAG(由题意得),其无后继的点表示了一个加法或乘法操作。那么每做一个操作就相当于选取了一个从 \(1\) 到 \(t\)(\(t\) 无后继)的链,记作 \(1 \leadsto t\)。将每条链 \(1 \leadsto t\) 按照其 \(t\) 被遍历的顺序从 \(1\) 开始标号,当 \(t\) 对应加法操作时,称其为“加法链”;当 \(t\) 为乘法操作时,称其为“乘法链”。令 \(p_i \in \{0, 1\}\) 表示标号为 \(i\) 的链是否属于“乘法链”,\(v_i\) 表示标号为 \(i\) 的链,其终点对应的值,若 \(p_i = 0\) 则 \(v_i = 1\),可知对于每个“加法链” \(i\),其系数为 \(\prod_{j = i + 1}^r v_j \times [p_j = 1]\)。问题转化为如何快速计算每个加法点 \(u\),所有链 \(1 \leadsto u\) 的系数和。
记 \(w_{l \leadsto r}\) 表示点 \(l\) 到 \(r\) 的所有链的标号构成的集合,\(x \oplus y\)(\(x \in w_{a \leadsto b}\),\(y \in w_{b \leadsto c}\))表示链 \(x\) 与 \(y\) 首尾相接形成的链 \(a \leadsto c\) 的标号,\(L\) 为 \(G\) 的无后继点集,记 \(f_i\) 满足:
咱们假设点 \(i\) 有前继 \(\{u_1, u_2, \cdots, u_s\}\),且 \(u_i\) 比 \(u_{i + 1}\) 更先被遍历,考虑抽离一个 \(j \in w_{1 \leadsto i}\) 单独考察。假设 \(j\) 上有点 \(u_h\),设 \(x \in w_{1 \leadsto u_h}\),则 \(j = x \oplus (u_h \rightarrow i)\),假设 \(u_h\) 有后继 \(\{v_1, v_2, \cdots, v_o\}\) 均在 \(i\) 之后被遍历,设 \(v_0 = i\),则有:
故咱们可以拆开后面的积式,得到:
令 \(g_i\) 表示从 \(i\) 出发经过所有不同的链走到的 \(v\) 之积,点 \(i\) 的后继点集为 \(Su_i\) 即有:
由此可得:
最终每个加法点 \(c\) 的结果即为:\(M a_i + f_c v_c\),\(a_i\) 为点 \(c\) 操作的位置的初始值,\(v_c\) 为其加的值。
P7114
不知道怎么想出来的神秘做法,非常酷!
首先咱们发现枚举 \(C\) 很不好做,咱们考虑...接着枚举 \(C\),嗯造就完了!
假设 \(C\) 已知,则 \((AB)^k\) 已知,咱们令串 \(S = (AB)^k\),若 \(S\) 存在一个整周期 \(T \le \frac{|S|}{2}\),使得其刚好将 \(S\) 划分成相同的 \(\frac{|S|}{T}\) 份,根据弱周期引理,假设 \(S\) 存在周期 \(p, q\)(无需相异),则 \(p + q \le |S|\),故 \(\gcd(p, q)\) 也是 \(S\) 的一个满足上述条件的整周期,故此时 \(S\) 的最小正周期必然满足上述条件(反证法:若不满足则导出更小周期)。若 \(S\) 不存在一个整周期 \(T \le \frac{|S|}{2}\),则 \(S\) 必然只存在一个满足可以将其划分成若干相同部分的周期:\(|S|\)。
于是咱们分两种情况讨论:存在 \(T\) 与不存在 \(T\)。
-
存在 \(T\):咱们记 \(T_0\) 为 \(S\) 的最小正周期,则对于任意满足条件的周期 \(T = pT_0, p \in \mathbb{N}\),咱们记最小正周期对应的串为 \(T_s\),令 \(m = \frac{|S|}{T_0}\),\(D_i\) 表示 \(i\) 的因子集,\(d_i\) 表示 \(i\) 的因子个数,\(d'_i\) 表示 \(i\) 的奇因子个数,\(e_i\) 表示 \(i\) 的因子和,则对于任意一个 \(A\),都存在一个 \(q \in \mathbb{N}\),使得 \(A = T_s^q A'\),且 \(A'\) 的长度 \(L_{A'} \in [0, T_0)\)。
咱们考虑 \(F(A) = F(T_s^q A')\) 的值:当 \(2 | q\) 时,\(T_s^q\) 中的字符均出现偶数次,则 \(F(T_s^q A') = F(A')\);当 \(2 \perp q\) 时,\(T_s^{q - 1}\) 中的字符均出现偶数次,则 \(F(T_s^q A') = F(T_s A')\)。
接下来咱们考虑对于一个被计数到(符合题意)的 \(A\),其对应的符合题意的 \(B\) 有多少个:若 \(A = T_s^q A'\),则 \(AB = T_s^r\)(\(r > q\)),且由于 \(A\) 确定,故每个 \(AB\) 对应一个 \(B\),故共有 \(\sum_{r > q, r \in D_m} 1\) 种可能。然后咱们考虑对于一个被计数到的 \(A'\),其对于的 \((A, B)\) 共有多少个,此时又分两种情况:
-
\(F(A') \le F(C)\),则对于任意 \(A = T_s^q A'\),\(2 | q\) 均被计数到,令 \(q = 2j\),\(j \in [0, \lfloor \frac{m}{2} \rfloor]\),则共有
\[\sum_{j = 0}^{\lfloor \frac{m}{2} \rfloor} \sum_{r > 2j, r \in D_m} 1 = \sum_{r \in D_m} \sum_{j = 0}^{\lfloor \frac{r - 1}{2} \rfloor} 1 = \sum_{r \in D_m} \lfloor \frac{r + 1}{2} \rfloor \]种可能。
-
\(F(T_s A') \le F(C)\),则对于任意 \(A = T_s^q A'\),\(2 \perp q\) 均被计数到,令 \(q = 2j + 1\),\(j \in [0, \lfloor \frac{m - 1}{2} \rfloor]\),则共有
\[\sum_{j = 0}^{\lfloor \frac{m - 1}{2} \rfloor} \sum_{r > 2j + 1, r \in D_m} 1 = \sum_{r \in D_m} \sum_{j = 0}^{\lfloor \frac{r}{2} \rfloor - 1} 1 = \sum_{r \in D_m} \lfloor \frac{r}{2} \rfloor \]种可能。
咱们考虑将两个柿子处理一下:
\[\begin{gather*} \sum_{r \in D_m} \lfloor \frac{r + 1}{2} \rfloor = \sum_{r \in D_m, 2 | r} \frac{r}{2} + \sum_{r \in D_m, 2 \perp r} \frac{r + 1}{2} = \frac{1}{2} (e_m + d'_m)\\ \sum_{r \in D_m} \lfloor \frac{r}{2} \rfloor = \sum_{r \in D_m, 2 | r} \frac{r}{2} + \sum_{r \in D_m, 2 \perp r} \frac{r - 1}{2} = \frac{1}{2} (e_m - d'_m) \end{gather*} \]咱们记满足 \(F(A') \le F(C)\) 的 \(A'\) 个数为 \(G\),满足 \(F(T_s A') \le F(C)\) 的 \(A'\) 个数为 \(H\),则答案为 \(\frac{G}{2} (e_m + d'_m) + \frac{H}{2} (e_m - d'_m)\)(包含 \(A = \varnothing\)),咱们考虑减去 \(A = \varnothing\) 即 \(A' = \varnothing\),\(q = 0\) 的情况个数,由 \(2 | q\) 时的柿子不难看出,当 \(j = 0\) 时的值 \(\sum_{r \in D_m, r > 0} 1 = d_m\) 即为所求,故最终答案为 \(\frac{G}{2} (e_m + d'_m) + \frac{H}{2} (e_m - d'_m) - d_m\)。
-
-
不存在 \(T\):此时 \(AB = S\),则满足 \(F(A) \le F(C)\) 的 \(A\)(\(A \neq \varnothing \land A \neq S\))即为所求。
众所周知 Border 与 Period 是对偶的,故咱们可以通过 kmp 求出最小正周期,接下来咱们求出所有 \(F_i = F(D), D = S_{[1, i]}\),则求 \(G, H\) 和满足 \(F(A) \le F(C)\) 的 \(A\) 就均转化为了区间查询 \(\le x\) 的值的元素个数的问题,由于 \(F\) 的值域为 \(|\Sigma|\),所以可以直接前缀和,时间复杂度 \(O(|\Sigma| |S|)\)。
CF1322B
即求:
咱们考虑拆位,考虑 \(a_i\) 的二进制形式 \({a_i}_{(2)}\) 和 \(A\) 的二进制形式 \(A_{(2)}\),考虑 \(A_{(2)}\) 的第 \(k\) 位,其值与 \({a_i}_{(2)} + {a_j}_{(2)}\) 的第 \(k\) 位为 \(1\) 的个数在 \(\mod 2\) 意义下同余,考虑怎么求这样的有序数对 \((i, j)\) 的个数。
咱们知道:\({a_i}_{(2)} + {a_j}_{(2)}\) 的第 \(k\) 位与其第 \(k' > k\) 位是无关的,只有第 \(k' \le k\) 位才有可能通过进位影响其取值,不妨令 \({b_{i, k}}_{(2)}\) 表示 \({a_i}_{(2)}\) 的前 \(k\) 位所形成的数。咱们假设 \({a_i}_{(2)} + {a_j}_{(2)}\) 的第 \(k\) 位为 \(1\),则有一下两种情况:
- 第 \(k\) 位未发生进位:则 \({b_{i, k}}_{(2)} + {b_{j, k}}_{(2)}\) 从第 \(k + 1\) 位到第 \(0\) 位形如 \(0, 1, \cdots\),即 \({b_{i, k}}_{(2)} + {b_{j, k}}_{(2)} \in [2^k, 2^{k + 1} - 1]\)。
- 第 \(k\) 位发生进位:则 \({b_{i, k}}_{2} + {b_{j, k}}_{(2)}\) 从第 \(k + 1\) 位到第 \(0\) 位形如 \(1, 1, \cdots\),即 \({b_{i, k}}_{(2)} + {b_{j, k}}_{(2)} \in [2^{k + 1} + 2^k, 2^{k + 2} - 2]\)。
现在咱们将问题转化为了统计 \(n\) 个数中抽出哪两个数满足其和在一个区间里,这不是咱们 2SUM 吗,复杂度 \(O(n \log n \log \max a)\)。
CF1338B
好题 111!
假设存在两条路径 \(a \leadsto b\) 和 \(a \leadsto c\),则这两条路的异或(对称差)即为路径 \(b \leadsto c\),因此咱们指定一个叶子 \(r\) 作为树根,则原条件等价于“使得任意叶子到 \(r\) 的链上边权异或和均为 \(0\)”。
首先咱们考虑如何取到权值个数的最小值:咱们注意到 \(1 \oplus 2 \oplus 3 = 0\),如果对于任意叶子 \(x\) 到 \(r\) 的距离均为偶数,则可以所有边权均设为 \(1\),答案为 \(1\);否则,答案不可能为 \(2\),因为如果存在一个解,其边权的值域为 \(\{a, b\}\),则对于任意链,其边权异或和只可能为 \(\{0, a, b, a \oplus b\}\),又因存在长为奇数的链,故长为奇数的链上的边权异或和必然为 \(\{a, b\}\),与题意不符;考虑答案是否会 \(= 3\),咱们做如下构造:抽出叶子 \(x\) 使得其到 \(r\) 的长度为奇数,将这条链上除了与 \(x\) 和 \(x\) 的父节点相连的边以外的边权全部赋为 \(1\),剩下的两个边的权赋为 \(2, 3\),此时这条链上的边权异或和为 \(1 \oplus 2 \oplus 3 = 0\),接下来咱们抽出来一个新的叶子 \(x'\),记 \(c = Lca(x, x')\),则按 \(r\) 到 \(c\) 的边权异或和分以下几种情况讨论:
- 异或和 \(= 0\),此时 \(c \leadsto r\) 的链上的边权均为 \(1\),令 \(d = dis(c, x')\),若 \(d = 1\),则令边 \(c \rightarrow x'\) 的权为 \(3\),\(c\) 到其父节点和链 \(c \leadsto x\) 的链上的子节点的边权赋为 \(2\),此时不改变 \(r \leadsto x\) 的链上的边权异或和,且 \(r \leadsto x'\) 的链的边权异或和为 \(1\oplus 2 \oplus 3 = 0\);若 \(d = 2\),则令 \(c \leadsto x'\) 的两条边上边权均为 \(1\),此时的正确性(不改变 \(r \leadsto x\) 链的边权异或和且 \(r \leadsto x'\) 的边权异或和为 \(0\))显然;当 \(d > 2\) 时,与 \(r \leadsto x\) 链的构造方法一致。
- 异或和 \(= 1\),此时 \(c \leadsto r\) 的链上的边权均为 \(1\),令 \(d = dis(c, x')\),若 \(d = 1\),则令边 \(c \rightarrow x'\) 的权为 \(1\),正确性显然;若 \(d = 2\),则在两条边上分别赋 \(2, 3\),正确性显然;若 \(d > 2\),则先在 \(c \leadsto x'\) 的链上选一条边赋 \(1\),再使用与 \(r \leadsto x\) 链相同的构造方法。
- 异或和 \(= 3\),此时 \(c \leadsto r\) 的链上的边权为一个 \(2\) 和奇数个 \(1\),令 \(d = dis(c, x')\),若 \(d = 1\),则令边 \(c \rightarrow x'\) 的权为 \(3\),正确性显然;若 \(d = 2\),则在两条边上分别赋 \(1, 2\),正确性显然;若 \(d > 2\),则先在 \(c \leadsto x'\) 的链上选一条边赋 \(3\),再使用与 \(r \leadsto x\) 链相同的构造方法。
构造完毕,充分性得证,必要性先前已经证明。
然后咱们考虑如何取到权值种类的最大值:此时咱们令一个非叶子节点作根,注意到解的必要条件是对于任意点到其子树内的任意一个叶子的链上的边权异或和均相等,则对于一个与 \(t\) 个叶子邻接的点,该点到这 \(t\) 个叶子的边的权均相等,故假设有 \(x\) 个点与叶子邻接、\(y\) 个点为叶子,则最终答案 \(\le n - 1 - y + x\),现在咱们证明这个上界是可以取到的:咱们记 \(S_u\) 表示点 \(u\) 的子树内的边权值域,\(x_u\) 表示点 \(u\) 到其子树内的叶子的链上的边权异或和,假设 \(u\) 的儿子为 \(\{v_1, v_2, v_3, \cdots, v_o\}\),\(w_i\) 表示 \(u \rightarrow v_i\) 的边上的边权,则有:\(x_u = x_{v_i} \oplus w_i\),则有 \(w_i = x_u \oplus x_{v_i} = w_{i - 1} \oplus x_{v_{i - 1}} \oplus x_{v_i}\),这意味着只要 \(w_1\) 确定,\(w_{2, 3, \cdots, o}\) 也就随之确定了,此时的证明已经呼之欲出了:咱们可以往 \({w_1}_{(2)}\) 的无限高位填 \(1\),从而构造无限个 \(\{w_1, w_2, \cdots, w_o\} \subset \mathbb{N_+}\),又因 \(\cup_{i = 1}^o S_{v_i}\) 为有限集,故若不存在 \(x_{v_i} = x_{v_{i + 1}}\),则必然可以做到 \(w_i\) 与原先的值域不重合。而如果 \(x_{v_i} = x_{v_{i + 1}}\) 且 \(v_i, v_{i + 1}\) 中存在一个点不是叶子(不妨设为 \(v_i\)),则咱们可以将 \(v_i\) 的所有 \(w\) 的一个无限高位上均做一次翻转,此时仍满足条件且 \(x_{v_i} \neq x_{v_{i + 1}}\)。故此时答案取到上界 \(n - 1 - y + x\)。
故咱们只需要判断树中有没有到根距离为奇数的叶子并统计出叶子和与叶子邻接的点数即可。