Loading

wjc 题解合集

wjc 题解合集

CF547D

考虑 \(x_i\)\(y _i\) 连边,跑欧拉回路,然后在环上交替染红蓝。
如果有长度为偶的欧拉回路,这样显然是对的。对于奇点,套路性的建虚点,连虚边即可。如果做完后有偶数条边,给虚点连一个自环即可。
复杂度 \(\mathcal{O} (n + V)\)

CF436E

首先分讨:

  1. \(2 \times a_i \le b_i\),直接拆成 \(a_i\)\(b_i - a_i\)
  2. \(2 \times a_i > b_i\),考虑直接把 \((b_i, 2)\) 塞进优先队列里,然后按平均值贪心选。

但这样会有一个问题,可能选多一个,考虑反悔,有以下几种策略:

  1. 把一个选了的 \(b_i\) 改成 \(a_i\)
  2. 少选选了的最大的 \(b_i\),多选没选的最小的 \(a_i\)
  3. 少选选了的最大的 \(a_i\)

找到代价最小的情况即可。复杂度 \(\mathcal{O} (n \log n)\)

agc066_a

显然把每个数用两个 \(d\) 的倍数卡,注意到 abs(奇数 - 偶数) >= 1,且相邻两数必定一奇一偶,所以黑白染色后黑格设为 \(d\) 的奇数倍,白格设为偶数倍,不行就换一下,就做完了。

arc170_c

\(m > n\) 因为 mex 不会爆,直接乘即可。

\(m \le n\) 时,显然 mex 具体是几不重要,他会不会爆掉取决于有多少不同的数。于是令 \(f_{i, j}\) 表示 \(a_1, \cdots ,a_i\)\(j\) 个不同数的方案数,转移是简单的。
复杂度 \(\mathcal{O}(n ^ 2)\)

uoj 805

首先有一些显然的结论:一个区间合法当且仅当

  1. 长度为偶数。
  2. 把所有问号换成左括号后前缀左括号个数始终大于等于前缀右括号个数
  3. 把所有问好换成右括号后后缀右括号个数始终大于等于后缀左括号个数
    结论证明就是把前面一些问号换成左括号,后面一些问号换成右括号,使左右括号个数相等。这样前面一段合法性由 2 保证,后面一段合法性由 3 保证。

知道这个之后单调栈 + BIT 即可。复杂度 \(\mathcal{O}(n \log n)\)

CF1603C

根据贪心,每次往前加元素时后面的不会动,而且分的个数尽量少,尽量平均,所以 \(\mathcal{O}(n ^ 2)\) 做法显然。

\(f_{i, j}\) 表示有多少个 \(k\) 使考虑 \(a_i, a_{i + 1}, \cdots, a_k\) 时需要把 \(a_i\) 拆成若干个 \(j\) (和 \(j + 1\))。那么答案就是 \(\sum \limits_{i, j} i(\lceil\dfrac{a_i}{j}\rceil - 1)f_{i, j}\)。注意到有用的 \(j\) 对于任意 \(i\) 只有 \(\mathcal{O}(\sqrt V)\) 个,从后往前扫就做完了。

复杂度 \(\mathcal{O} (n \sqrt V)\)

P6240

考虑猫树分治,合并的时候由于是两个背包,查单点,是 \(\mathcal{O}(V)\) 的,预处理由于结点总长度是 \(\mathcal{O}(n \log n)\),所以总复杂度为 \(\mathcal{O}(nV \log n + qV)\)

CF1620F

显然有长度 \(\ge 3\) 的下降子序列就寄了,由 Dilworth 定理,原序列由两个上升子序列构成。

考虑 dp,设 \(f_{i, j, k}\) 表示考虑到第 \(i\) 个位置,上升子序列末尾元素分别为 \(j, k\) 是否可行。首先注意到 \(j, k\) 中必有一个等于 \(a_i\)\(-a_i\),压掉一维。然后剩下一维改成求最小可能值,再压一维,复杂度 \(\mathcal{O}(n)\)

gym 102331 B

显然建 01-trie。设 \(x\) 最高位为第 \(k\) 位。注意到第 \(k - 1\) 位以下的子树每个最多只能选一个数,第 \(k + 1\) 位以上只要更低的子树内部合法即可。第 \(k\) 位的话只选一边是简单的,两边都选考虑双指针,dfs 0 子树的时候用指针扫一下 1 子树然后遇到 0 位乘一下子树大小累加即可。

复杂度 \(\mathcal{O}(n \log V)\)

uoj 883

首先考虑 \(k = 0\),此时容易证明当且仅当删掉多余子树(即不含景点的子树)后,按某条欧拉序遍历最优。进一步,容易证明将长为 2 的跳跃拆分为两个长为一的跳跃后,仍是一条欧拉序(否则跳跃少走一步,但会比欧拉序多走两个节点,不优)。于是考虑 dp,设 \(f_{i, j}\) 表示考虑第 \(i\) 个结点的子树,头尾有 \(j\) 个待连接的奇数长度路径,最少的奇数长度路径个数。

考虑转移,首先,若自己为景点,可以看作一颗 \(f_0 = f_1 = +\infin, f_2 = 0\) 的子树。若子树中只有一个有景点,转移是简单的。否则考虑分讨:设选择了 \(a\)00\(b\)01\(c\)11。(即分别指 \(f_{i, 0}, f_{i, 1}, f_{i, 2}\)

  1. 转移到 \(f_{x, 0}\),则要求 \(a + b \ge 2\)(即一头一尾)。若 \(c = 0\),则会多产生 \(b \bmod 2\) 个奇数长度的路径,否则 \(b = 0\) 时会产生两条奇数长度路径,\(b > 0\) 是会产生 \(b \bmod 2\) 个奇数长度路径(需考虑 0011 的连接)。
  2. 转移到 \(f_{x, 1}\),则要求 \(a + b \ge 1, a + c \ge 1\),且会多产生 \(1 - b \bmod 2\) 个奇数长度路径。
  3. 转移到 \(f_{x, 2}\)\(01\) 互换后即为 \(f_{x, 0}\) 的情况。

整理后容易发现,我们只关心 \(a = 0/1/\ge 2\)\(c = 0/1/\ge 2\)\(b = 0/1/2k/2k + 1, k \in \mathbb{Z} _ +\),直接扔进状态,dp 即可。复杂度 \(\mathcal{O}(n)\)

P7670

设询问串有 \(a\)0\(b\)1\(c\)?。全是 0? 是即为高维前缀和,如果有 11 替换为 ? 容斥即可,故有 \(\mathcal{O}(2 ^ b)\) 做法。同理有 \(\mathcal{O}(2 ^ a)\) 做法,\(\mathcal{O}(2 ^ c)\) 暴力枚举问号即可。复杂度 \(\mathcal{O}(2 ^ L L + q 2 ^ {\frac{L}{3}})\)

P5643

https://www.cnblogs.com/aemmprty/p/18996365

agc038_e

\([0, n - 1] \to [1, n]\)。首先 min-max 容斥,考虑对于集合 \(\emptyset \neq S \subseteq [n]\),如何算对 \(x \in S\) 最先达到 \(B_x\) 个的期望时间。由于 \(E[X] = \sum\limits_{i = 1} ^ {+\infin} P(X \ge i)\),考虑计算 \(P(X \ge i)\) 的值。即选了 \(i\) 个数后 \(\forall x \in S\)\(x\) 都出现了不超过 \(B_x - 1\) 次。

\(V = \sum\limits_{i = 1} ^ n A_i\)。注意到 \(\boxed{\sum\limits_{i = T} ^ {+ \infin} \dbinom{i}{T} p ^ {i - T} = \dfrac{1}{(1 - p) ^ {T + 1}}}\)。记 \(p_{S, T}\) 表示 \(T\) 次选中 \(S\) 中的数且 \(\forall x \in S\)\(x\) 都只被选了至多 \(B_x - 1\) 次的概率,我们所求即为 \(\sum\limits_{S \subseteq [n]} \sum\limits_T \sum\limits_{i = T} ^ {+ \infin} (-1) ^ {|S| - 1} \dbinom{i}{T} p_{S, T} \Big(1 - \dfrac{\sum_{x \in S} A_x}{V}\Big) ^ {i - T} = \sum\limits_T \sum\limits_U \Big(\sum \limits_{i = T} ^ {+ \infin}\dbinom{i}{T} \Big(1 - \dfrac{U}{V}\Big) ^ {i - T}\Big)\sum\limits_{S \subseteq [n]} (-1) ^ {(|S| - 1)} p_{S, T} [\sum\limits_{x \in S} A_x = U] = \sum\limits_T \sum\limits_U \Big(\dfrac{U}{V}\Big) ^ {-T - 1}\sum\limits_{S \subseteq [n]} (-1) ^ {(|S| - 1)} p_{S, T} [\sum\limits_{x \in S} A_x = U]\)

考虑如下 dp,记 \(f_{i, j, k}\) 为考虑前 \(i\) 个数,选了的数 \(\sum A = j\),共选了 \(k\) 个,且考虑容斥系数。则转移方程为 \(f_{i, j, k} = f_{i - 1, j, k} - \sum\limits_{l = 0} ^ {\min(j, B_i - 1)} f_{i - 1, j - A_i, k - l} \binom{k}{l}\),注意到固定 \(j, k\)\(l\) 的总枚举量是 \(\mathcal{O}(n)\) 的,所以 dp 的复杂度为 \(\mathcal{O}(n ^ 3)\)。最后枚举 \(j, k\) 按上式贡献答案,总复杂度 \(\mathcal{O}(n ^ 3)\)

CF1750F

显然序列两端均为 \(1\),我们以下只讨论这样的序列。首先容易观察到,操作到不可操作后将原序列分为若干个 \(0, 1\) 的连续段后,所有 \(0\) 段长均大于两侧 \(1\) 段长的和。由于有效序列较难统计,我们考虑在操作到不可操作处统计无效序列。

\(f_{i, j}\) 表示长度为 \(i\),操作到不可操作后结尾 \(1\) 连续段长度为 \(j\) 的无效序列数,\(g_i\) 为长度为 \(i\) 的有效序列数(在求完所有 \(f_{i, x}\) 后用总方案数减掉 \(\sum\limits_{x = 1} ^ {i - 1} f_{i, x}\) 即可,并将其视作 \(f_{i, i}\))。转移时考虑枚举倒数第二个一段长,知转移方程为 \(f_{i, j} = \sum\limits_l \sum\limits_{k = l} ^ {i - j - l - 1} f_{k, l} \times g_j\),前缀和优化可做到 \(\mathcal{O}(n ^ 3)\),进一步优化较为困难。

我们考虑分析转移的性质,我们发现记 \(j\) 的目的其实是为了保证相邻两段 \(1\) 段的长度和小于 \(0\) 段的长度,考虑尝试压掉这一维。我们考虑在放长度为 \(i\) 的末尾 \(1\) 段时同时在其前后各放置 \(i\)\(0\)(开头结尾需特殊处理)。那么,dp 可以写为 \(f_i = \sum\limits_{j = 1} ^ {\lfloor \frac{i - 1}{3} \rfloor} \Big(\sum\limits_{k = 0} ^ {i - 3j - 1} f_k\Big) g_j\)\(g_i = 2 ^ {i - 2} - \sum\limits_{j = 1} ^ {\lfloor \frac{i - 1}{2} \rfloor} \Big(\sum\limits_{k = 0} ^ {i - 2j - 1} f_k\Big) g_j\),前缀和优化即可,复杂度 \(\mathcal{O}(n ^ 2)\)

agc067_b

我们先考虑判定什么样的序列可以被染成。对于染色问题,套路地考虑将操作倒序进行。我们贪心地选颜色相同的 \([L_i, R_i]\),将区间内元素变为 ?(即可与任何颜色相同),不断操作,显然可以被染成当且仅当最后可以将整个序列全部变为 ?

我们仍然考虑在操作到不能操作的时候统计不能被染成的序列。考虑还剩下的元素,它们将序列分为若干个独立的区间,这启示我们考虑区间 dp。我们设 \(f_{l, r}\) 表示可以仅用 \([L_i, R_i] \subseteq [l, r]\) 的区间 \([L_i, R_i]\),将 \([l, r]\) 删空的染色方案数。先容斥。枚举区间左端点 \(l\),我们设 \(g_{x, p}\) 表示最后一个剩下的元素为 \(a_x\)\(a_x\) 之前最靠右的与它颜色不同的元素为 \(a_p\) 的方案数。注意,由于我们不知道右端点 \(r\),我们此时只考虑所有满足 \([L_i, R_i] \subseteq [l, x - 1]\) 的区间。根据转移可以发现我们需要预处理 \(vis_{l, r, x}\),表示是否存在 \(x \in [L_i, R_i] \subseteq [l, r]\)。考虑状态 \((i, p)\) 如何转移,枚举 \(j > i\) 表示下一个剩下的元素,则在保证 \(\neg vis_{p + 1, j - 1, i}\) 的前提下,可向 \(g_{j, i}\) 贡献 \((c - 1) \times g_{i, p} \times f_{i + 1, j - 1}\),向 \(g_{j, p}\) 贡献 \(g_{i, p} \times f_{i + 1, j - 1}\)。特别的,dp 初值为 \(g_{l - 1, l - 1} = 1\)。统计答案时,枚举最后一个剩下的元素 \(a_i\),有 \(f_{l, r} = c ^ {r - l + 1} - \sum \limits_{i = l} ^ r \sum \limits_{p = l - 1} ^ {i - 1} g_{i, p} \times f_{i + 1, r}\),要求为 \(\neg vis_{p + 1, r, i}\)。注意转移顺序,复杂度为 \(\mathcal{O}(n ^ 4)\)

其实这个 dp 的正确性和初值设定并没有那么显然,所以我们稍微证一下。只考虑剩下的元素时,考虑其形成的一个同色连续段 \(a_{i_1}, a_{i_2}, \cdots a_{i_m}\),其左、右剩下的元素分别为 \(a_x, a_y\)(若左右分别为左边界或右边界,初值和统计答案的过程告诉我们应当将 \(a_{l - 1}\) 视作 \(a_x\)\(a_{r + 1}\) 视作 \(a_y\)。事实上,我们接下来会证明 \(\not \exist i_j \in [L_k, R_k] \subseteq [x + 1, y - 1]\),这与边界时所需证明的情形相一致)。若不满足条件,则 \(\exists i_j \in [L_k, R_k] \subseteq [x + 1, y - 1]\),而根据转移过程,我们有 \([L_k, R_k] \not \subseteq [x + 1, i_{j + 1} - 1]\),故有 \(i_{j + 1} \in [L_k, R_k]\) 同理 \(i_{j + 2} \in [L_k, R_k], \cdots ,i_m \in [L_k, R_k]\),进一步根据转移过程,可得 \(y \in [L_k, R_k]\),与假设矛盾。

CF1605F

\(\mathbf{Part. 0}\) 如何判定

首先依然考虑如何判定。容易注意到只有 \(i \le \dfrac{n}{2}\) 的限制有用。我们考虑贪心。每次对于两个相等的数,则令它们分别为 \(a_1, a_n\),并将它们二进制为 \(1\) 的位删去。重复该过程,显然原序列是好的当且仅当可以将原序列删空或只留一个元素。

\(\mathbf{Part.1}\) 分析性质

对于一个坏序列,我们考虑贪心地删元素后序列的剩余部分,我们希望它是唯一的,但其实并不是。我们容易发现留下的序列中 \(a_i\) 互不相同,且若 \((a_i, a_j)\) 在若干次操作前已经相等,则操作后必然仍相等。考虑利用以上两条性质分析序列剩余部分满足的条件。如果存在两个不同的操作若干次后的子序列 \(A, B\) 均不能操作,我们考虑说明两者删去的二进制位一定相同。我们设 \(A\) 中按 \(x_1, x_2, \cdots, x_i\) 的顺序删去二进制位,\(B\) 中按 \(y_1, y_2, \cdots, y_j\) 的顺序删去二进制位,不妨 \(i \ge j\),则由假设,\(\exist x_k \not \in \{y_1, y_2, \cdots, y_j\}\),我们找到满足这样条件最小的 \(k\)。我们设操作到 \(A\) 的过程中,\((u, v)\) 操作删去了二进制的第 \(x_k\) 位。则若 \(u\)\(v\)\(B\) 中已经操作过,第 \(x_k\) 位显然已经被删去,矛盾。若 \((u, v)\) 还未被操作过,由于 \(k\) 的最小性,知此时 \((u, v)\)\(B\) 中可以被操作,矛盾。

故我们说明了,操作到不能操作后,剩余的二进制位构成的集合是固定的。进一步,我们可以发现,若在某种操作方法里,\(a_x\) 可以被删去,则在其他情况下,\(a_x\) 要么变成 \(0\),要么被删去,且这样的 \(x\) 至多有一个。

\(\mathbf{Part.2}\) 找到坏序列与长度更小的好序列的一一对应

对于一个序列,我们称其的最长好子序列 \(a_{i_1}, a_{i_2}, \cdots, a_{i_m}\) 为满足:

  1. \(a_{i_1}, a_{i_2}, \cdots, a_{i_m}\) 是好的。
  2. \(S_i\)\(i\) 的二进制为 \(1\) 的位构成的集合,若 \(2 \nmid m\),则 \(S_{i_{\frac{m + 1}{2}}} \subseteq \bigcup\limits_{j \neq \frac{m + 1}{2}} S_{i_j}\),即 \(a_{i_{\frac{m + 1}{2}}}\) 在贪心删元素与二进制位的过程后会变为 \(0\)
  3. 是满足上述条件的子序列中最长的。

根据 \(\mathbf{Part.2}\) 的论述,我们发现该子序列恰为所有可能被删去的元素,故是唯一的。

\(\mathbf{Part.3}\) 设计dp

下称满足 \(\operatorname{popcount}(a_1 \operatorname{or} a_2 \operatorname{or} \cdots \operatorname{or} a_i) = j\) 的序列 \(a_1, \cdots, a_i\) 为恰含有 \(j\) 个二进制位的序列。考虑设 \(f_{i, j}\) 表示长度为 \(i\),恰含有 \(j\) 个二进制位的合法序列数。注意,对于 \(2 \nmid i\) 的情况,我们只计数排序后 \(a_{\frac{i + 1}{2}}\) 不产生新的二进制 \(1\) 位的序列。记 \(g_{i, j} = \sum\limits_{k = 0} ^ j \dbinom{j}{k} (-1) ^ {j - k} 2 ^ {ik}\) 表示长度为 \(i\),恰含有 \(j\) 个二进制位的所有序列数。记 \(h_{i, j} = \sum\limits_{k = 0} ^ j \dbinom{j}{k} (-1) ^ {j - k} (2 ^ k − 1) ^ {\underline{i}}\) 表示长度为 \(i\),每个元素不为 \(0\) 且互不相同,且恰含有 \(j\) 个二进制位的序列个数。考虑转移。我们考虑枚举最长好子序列的长度为 \(k\),恰含 \(l\) 个二进制位。则转移为 \(f_{i, j} = g_{i, j} - \sum\limits_{k = 0} ^ {i - 1} \sum\limits_{l = 0} ^ {j - 1} \dbinom{i}{k} \dbinom{j}{l} 2 ^ {l(i - k)}h_{i - k, j - l}f_{k, l}\)。注意由于题目并未限制 \(a_{\frac{n + 1}{2}}\) 的二进制 \(1\),在 \(2 \nmid n\)\(f\) 的转移时,我们不需要减去 \(k = n - 1\) 的情况,特判即可。复杂度 \(\mathcal{O}(n ^ 2 k ^ 2)\),需要预处理 \(2\) 的幂。

T1

对右端点扫描线。只需找到 \(a_i\) 所有因数上一次出现的位置进行前缀取 \(\min\)。更新位置只有 \(d(a_i)\) 个。分块平衡一下,复杂度 \(\mathcal{O}(\sum d(a_i) + m \sqrt n)\)。空间 \(\mathcal{O}(n + m + V)\)

T2

打表可以发现后手必胜当且仅当 \(a_1 = a_2 = a_3, a_5 = a_6 = a_7, a_1 \oplus a_4 \oplus a_5 = 0\)。考虑计数。先容斥。设 \([L_1, R_1] = [l_1, r_1] \bigcap [l_2, r_2] \bigcap [l_3, r_3], [L_2, R_2] = [l_4, r_4], [L_3, R_3] = [l_5, r_5] \bigcap [l_6, r_6] \bigcap [l_7, r_7]\)。再容斥一次,把下界去掉,数位 dp 即可。

arc130_d

考虑 dp,设 \(f_{i, j, 0/1}\) 表示 \(i\) 的子树内满足 \(p_i = j\) 的且 \(i\) 比子节点的编号小/大的编号方案数(这里的 \(p\) 值域为 \([1, siz_i]\))。考虑转移,枚举子节点子树内比 \(i\) 小的 \(p\) 有多少个即可。前缀和优化后,树上背包复杂度为 \(\mathcal{O}(n ^ 2)\)

CF1612F

不妨设 \(n \le m\),注意到答案是 \(\mathcal{O}(\log n + \dfrac{m}{n})\) 量级的,套路地,将答案放进复杂度中。设 \(f_{i, j}\) 表示操作 \(i\) 次之后盔甲最高权值为 \(j\) 时武器的最高权值。考虑转移,我们发现由于列表中的装备只增加 \(1\),所以我们并不需要考虑选择更低权值的盔甲或武器。知道这一点后直接枚举新选盔甲还是武器进行转移即可。复杂度 \(\mathcal{O}(n (\log n + \dfrac{m}{n})) = \mathcal{O}(n \log n + m)\)

uoj549

数据范围较小,贡献关于二进制每一位独立,且貌似除了暴力 dp 没有更好的算法。考虑经典 trick(类似题目:P3773):将二进制位分成两部分,用不同的 dp 转移方式。具体的,我们重新定义 \(a_i\) 为其前缀 \(\operatorname{xor}\) 和,设 \(dp_{i, j}\) 为将 \(a_1, a_2, \cdots, a_i\) 分成 \(j\) 段的 \(\operatorname{xor}\) 和之和的最小值。我们将值域拆成前 \(8\) 位和后 \(8\) 位。我们定义 \(f_{i, j}\) 为目前所有计算过的 dp 值中所有满足 \(a_x\)\(i\)\(8\) 位相同的 \(dp_{x, j} \oplus i \oplus a_x\) 的最小值(即我们在此处提前考虑了二进制前 \(8\) 位的贡献)。在处理完 \(dp_{i, j}\) 之后,我们枚举二进制前 \(8\) 位的值即可完成对 \(f\) 的计算。在计算 \(dp_{i, j}\) 时,我们枚举与 \(a_i\) 二进制前 \(8\) 位相同的数 \(x\),考虑后八位的贡献。即 \(dp_{i, j} = \min\limits_x f_{x, j - 1} \oplus a_i \oplus x\)。容易发现,总复杂度为 \(\mathcal{O}(nk \sqrt V)\)

这个 trick 的关键在于注意到贡献关于二进制位独立,将 dp 转移拆成两步,使用类似 meet in the middle 的技巧优化复杂度。

P7329

考虑 \(n\) 个序列同时二分。设目前每个序列二分的左右边界为 \([l_1, r_1], [l_2, r_2], \cdots, [l_n, r_n]\),取中点为 \(mid_1, mid_2, \cdots, mid_n\),若 \(\sum\limits_{i = 1} ^ n mid_i \ge k\),我们将查询到的重要度最高的 \(mid_j\)\(r_j\) 变为 \(mid_j\),否则同理将重要度最低的 \(mid_j\) 对应的 \(l_j\) 变为 \(mid_j\)。考虑分析复杂度,我们每个区间的 \(l, r\) 总共只会移动 \(m\) 次,而每次二分只需要多查询一个点的重要度,故至多查 \(nm\) 次。

CF1421E

首先,容易发现每个元素的贡献为 \(1\)\(-1\)。我们考虑怎样的贡献序列是合法的。首先,容易注意到 \(-1\) 的个数与 \(1 - n\) 模三同余。其次,\(n \ge 2\) 时显然必须有两个连续的 \(1\)\(-1\)。下证明这是贡献序列合法的充要条件。

考虑对 \(n\) 归纳证明充分性。\(n \le 3\) 时显然。若 \(n - 1\) 时成立,\(n\) 时,考虑一个长度大于等于 \(2\)\(1/-1\) 连续段。若该连续段为整个序列,由于 \(n \ge 4\),任操作靠边的两个元素即可。否则我们操作该连续段靠边界且该边界外还有数的两个元素,易知仍满足归纳假设。

结论证毕后记 \(f_{i, 0/1/2, 0/1, 0/1}\) 表示考虑 \(a_1, a_2, \cdots, a_i\)\(-1\) 个数 \(\bmod 3\),是否有长度 \(\ge2\) 的连续段,上一个系数为 \(1/-1\),直接转移即可,复杂度 \(\mathcal{O}(n)\)

CF1188B

注意到 \((a_i + a_j)(a_i ^ 2 + a_j ^ 2) = \dfrac{a_i ^ 4 - a_j ^ 4}{a_i - a_j}\),我们有 \(\dfrac{a_i ^ 4 - a_j ^ 4}{a_i - a_j} \equiv k (\bmod p)\),又 \(a_i \not \equiv a_j \pmod p\),有该式等价于 \(a_i ^ 4 - a_j ^ 4 \equiv ka_i - ka_j \pmod p\),故 \(a_i ^ 4 - ka_i \equiv a_j ^ 4 - ka_j \pmod p\),扔进 map 直接算即可,复杂度 \(\mathcal{O}(n \log n)\)

P6189

考虑根号分治,将序列拆成 \(\ge \sqrt n\)\(< \sqrt n\) 的两段。第二段完全背包即可。第一段差分后按 \(\bmod\) 选择的数个数进行前缀和优化 dp 或将递减的序列的构造过程拆分为新加入元素 \(\sqrt n\) 与整体加 \(k\) 两种操作均可,复杂度 \(\mathcal{O}(n \sqrt n)\)

CF1479D

考虑给每个 \(a_i\) 随机赋权求 \(\operatorname{xor}\) 和,若 \(\operatorname{xor}\) 和为 \(0\) 则视为所有数均出现了偶数次。考虑维护主席树,在第 \(u\) 个节点主席树区间 \([l, r]\) 维护 \(u\) 到根的路径上区间 \([l, r]\) 内的数的权值异或和,查询时主席树上二分即可,复杂度 \(\mathcal{O}((n + q) \log n)\)

CF1458C

考虑维护 \((x, y, z)\) 表示位置 \((x, y)\) 的值是 \(z\),我们发现 \(I\) 操作是将 \((x, y, z)\) 变为 \((x, z, y)\)\(C\) 操作是将 \((x, y, z)\) 变为 \((z, y, x)\)\(U, D, L, R\) 是将一维整体加减 \(1\),打标记维护即可。复杂度 \(\mathcal{O}(n ^ 2 + m)\)

CF1270G

原限制条件可转化为 \(1 \le i - a_i \le n\),考虑 \(i - a_i\)\(i\) 连边,找环即可,复杂度 \(\mathcal{O}(n)\)

CF1844G

\(1\) 为根,设第 \(i\) 个点的深度为 \(f_i\),记 \(u_i = \operatorname{lca}(i, i + 1)\),则题目条件可转化为 \(f_i + f_{i + 1} - 2 f_{u_i} = d_i\),即 \(f_{i + 1} = d_i + 2f_{u_i} - f_i\),我们发现在不考虑 \(u_i\) 的情况下,可以直接解出 \(f_{i + 1}\),而\(f_{u_i}\) 系数为 \(2\),所以我们考虑在二进制下从低到高逐位确定。具体地,我们有 \(f_{i + 1} \equiv d_i - f_i \pmod 2\)\(f_{i + 1} \equiv d_i + 2(f_{u_i} \bmod 2) - f_i \pmod 4\),依此类推,我们可以解出 \(f_i \bmod 2 ^ {60}\) 的值,由于 \(2 ^ {60} > \sum d_i\),我们将 \(f_i \bmod 2 ^ {60}\) 视为 \(f_i\) 的真实值,验证 \(f_i > f_{fa_i}\)\(f_i + f_{i + 1} - 2f_{u_i} = d_i\) 即可,复杂度 \(\mathcal{O}(n(\log n + \log V))\)

agc055_b

我们注意到形如 XABC 的字串一定可以变成 ABCX,于是我们不断删去 ABCBCACAB,最后判断 \(S, T\) 是否相等即可。实现可以每次加一个字符,若结尾三个字符构成 ABCBCACAB 则直接删,复杂度 \(\mathcal{O}(n)\)

arc145_d

注意到一个三进制表示下只含 \(0, 1\) 的集合满足条件。我们又知道给所有数同增同减不改变性质,所以只需保证 \(\bmod n\) 余数正确。我们给每个数乘 \(3\),在将一部分加上 \(1\) 即可。

agc066_c

我们定义一个删除的 AABBAA 所对应的区间 \([l_i, r_i]\) 为该串最靠前与最靠后元素所夹成的区间。我们发现区间之间要么并列,要么嵌套。我们称 \([l, r]\) 为合法区间当且仅当 \([l, r]\) 可以被删空且存在一个删除串所对应的区间为 \([l, r]\) (即 \(l, r\) 在同一次操作中被删除)。这么定义是为了避免 \([l, r]\) 有并列的区间所拼成,导致性质被破坏。我们下证明一个区间合法的充要条件是:

  1. \(B\) 的个数为 \(\dfrac{r - l + 1}{3}\)
  2. \(s_l = B \or s_r = B\)

必要性显然。充分性依然考虑对区间长度归纳。\(len = 3\) 时显然。若 \(len - 3\) 时成立,\(len\) 时:我们容易发现存在长度 \(\ge 2\)\(A\) 连续段。由于总共 \(B\) 的个数 \(\ge 2\),显然可以找到连续段的一段删除 AABBAA 后仍保证开头或结尾有 \(B\)

考虑 dp,由于 \(B\) 的个数为 \(\dfrac{r - l + 1}{3}\),将 \(B\) 视为 \(-2\)\(A\) 视为 \(1\),在前缀和相等的位置进行转移即可。需要维护转移点后一个元素是否为 \(B\)

CF825G

考虑选一个黑点当根,注意到黑点到根的路径每个点都可以到达,除此之外每个点只能到自己到根的路径。复杂度 \(\mathcal{O}(n + q)\)

CF1117G

我们在最小值位置统计区间的贡献。先用单调栈预处理出每个点所对应的区间 \([l_i, r_i]\),表示 \(i\) 为区间最大值的极长区间,则询问 \([l, r]\) 的答案为 \(\sum\limits_{i = l} ^ r |[l_i, r_i] \bigcap [l, r]|\)。我们将 \([l_i, r_i]\) 拆成 \([l_i, i]\)\([i, r_i]\),做两次扫描线,每次用线段树维护区间加等差数列,区间和即可,复杂度 \(\mathcal{O}(n \log n)\)

CF2002F2

Write anything and pray that it will pass because of number theory magic.

我们充分发扬人类智慧,考虑默认 \((x, m - 121), (n - 121, y)\) 必然可达,对 \((n - u, m - v), (u,v \in [0, 120])\) 暴力 dp 即可。

P9902

考虑最大流最小割定理,将最大流转化为最小割。考虑状压,记 \(f_{i, S}\) 表示 \(i - k + 1, i - k + 2, \cdots, i\) 有哪些点在最小割中与 \(1\) 连通,枚举 \(i\) 是否与 \(1\) 连通转移即可。单次转移容易用递推优化至 \(\mathcal{O}(1)\),总复杂度为 \(\mathcal{O}(n 2 ^ k)\)

CF1270H

首先容易发现连通块必为区间。这是因为对于 \(i < j < k\),若 \((i, k)\) 有边,必有 \((i, j)\)\((j, k)\) 有边。其次,设连通块对应区间分别为 \([l_1, r_1], [l_2, r_2], \cdots, [l_m, r_m]\),容易发现 \(\forall x \in [l_k, r_k], y \in [l_{k + 1}, r_{k + 1}]\),必有 \(a_x > a_y\),我们考虑区间分界点,有 \(\min\limits_{i = 1} ^ {r_k} a_i > \max\limits_{i = l_{k + 1}} ^ n a_i\),且可以发现满足这样的点前后必为两个不同连通块,故连通块数量即为满足前缀 \(\min\) 大于后缀 \(\max\) 的点数。

考虑枚举后缀 \(\max\),检查是否存在满足条件的断点。我们发现在固定后缀 \(\max ( = v)\) 的情况下,合法的断点至多只有 \(1\) 个。我们考虑如何刻画是否有合法断点。我们将 \(> v\) 的数记为 \(1\)\(\le v\) 的数记为 \(0\),则有合法断点当且仅当序列形如 \(11\cdots100\cdots0\),即仅有一个串 \(10\)。我们考虑开一颗至于线段树维护对于每个数 \(10\) 的个数,则对于相邻两数 \(a_i, a_{i + 1}\),我们需要对区间 \([a_{i + 1}, a_i)\) 进行区间加。同时为了避免重复,我们只能统计 \(\exist a_i = v\)\(v\),故我们将所有 \(a_i\) 额外再减掉 \(1\),并统计 \(0\) 的个数即可。由于所有数均 \(\ge 0\),我们使用权值线段树维护区间 \(\min\) 与区间 \(\min\) 个数即可。复杂度 \(\mathcal{O}((n + V) \log V)\)

另一种理解方式:我们考虑断点什么时候合法。我们发现直接在序列上考虑很没有前途,离线也没有很好的性质,于是考虑在值域上理解。我们发现 \(i\) 是断点当且仅当区间 \([a_{i + 1}, a_i)\) 不被 \([a_{j + 1}, a_j)\) 的并所完全覆盖,于是就可以导出上述做法。

uoj747

注意到可以让所有人在一处相遇,这是因为相遇后可以让所有人跟着 hehe蚤 走。汇合点在点上是好做的。在边上考虑每个人应从边的哪一段进入。我们发现对于边 \((u, v)\),可以贪心地让从 \(u\) 一侧进入的人是按 \((x, u)\) 距离排序后的一个前缀,枚举即可。复杂度 \(\mathcal{O}(km\log m)\)

P7624

考虑差分约束。我们设环长为 \(L\)\(1\)\(i\) 的距离为 \(dis_i\),则容易把题目条件转化为关于 \(d_1, d_2, \cdots, d_n\) 的不等式。具体地,题目条件可以转化为:

  • \(d_n - d_1 < L\)\(d_{k + 1} - d_k \ge 1, k = 1, 2, \cdots, n - 1\)
  • 对于 \(1\) 类限制,若 \(S_i \le T_i\),有 \(d_{T_i} - d_{S_i} \ge L_i\),否则 \(d_{T_i} - d_{S_i} \ge x - L_i\)
  • 对于 \(2\) 类限制,若 \(S_i \le T_i\),有 \(d_{T_i} - d_{S_i} \le L_i\),否则 \(d_{T_i} - d_{S_i} \le x - L_i\)

我们发现不等式关于 \(L\) 是一次的,所以可行的 \(L\) 是一个区间。故考虑二分 \(L\) 的上下界。

对于上界的二分,若没有负环,则上界显然更大。否则考虑负环中 \(L\) 的系数 \(k\)

  1. \(k = 0\),则原题无解,由题意不会出现。
  2. \(k > 0\),则显然上界会更大。
  3. \(k < 0\),则显然上界会更小。

若上界过大,则有无穷多解。对于二分下界的情况同理。复杂度 \(\mathcal{O}(nm \log V)\)

uoj938

对于有根树,dp 即可,转移时考虑使用堆维护,每次取出 dp 值最小的两个元素,若相等则合并。需要特判只有 \(1\) 个子节点的情况。对于无根树,考虑换根,我们发现只需往 dp 值最大的子树换根,复杂度 \(\mathcal{O}(n \log n)\)

uoj386

先将固定器按大小排序。考虑枚举大小最大的固定器 \(x\)。先考虑暴力,我们初始设定选 \(x - m + 1, x - m + 2, \cdots, x\),此后从后向前扫,用堆维护牢固程度的前 \(m\) 大值。考虑以下两个优化:

  1. \(x\) 被弹出,则直接结束。
  2. 用 st 表 + 二分找到最靠后的牢固程度比第 \(m\) 大值大的元素。

可以证明,进行优化之后只会找 \(\mathcal{O}(nm)\) 个数,复杂度 \(\mathcal{O}(nm \log n)\)

CF1034D

\(\mathbf{Part.0}\) 分析问题

首先可以发现对 \(r = 1, 2, \cdots, n\),在前 \(k\) 大中所对应的 \(l\) 一定是前缀,且设前缀为 \([1, l_1], [1, l_2], \cdots, [1, l_n]\),必有 \(l_1 \le l_2 \le \cdots \le l_n\)。考虑将问题拆成两部分。第一部分先求出 \(l_1, l_2, \cdots, l_n\),第二部分求出对 \(r = 1, 2, \cdots, n\)\(l \in [1, l_r]\) 时区间内区间并集大小之和。

\(\mathbf{Part.1}\) 第一部分

考虑二分第 \(k\) 大值,则我们可以通过双指针求出 \(l_1, l_2, \cdots, l_n\)。具体地,我们需要支持维护第 \(l\) 个区间到第 \(r\) 个区间的并集大小,每次支持 \(r \leftarrow r + 1\)\(l \leftarrow l + 1\),可以使用扫描线维护矩形面积并的方法进行维护。复杂度 \(\mathcal{O}(n \log ^ 2 V)\)

\(\mathbf{Part.2}\) 第二部分

考虑对 \(r\) 扫描线。考虑维护 \(lst_i\) 表示 \(i\) 最后一次出现的位置,可以使用 ODT 做到 \(\mathcal{O}(n \log n)\),我们另开一颗线段树维护 \([i, r]\) 的区间的并集大小。考虑 \(lst\) 修改对并集大小的影响,我们发现将 \(lst_i\)\(x\) 改成 \(y\) 相当于对 \((x, y]\) 进行区间加,查询即为区间和,复杂度为 \(\mathcal{O}(n \log n)\)

故我们得出了一个总复杂度为 \(\mathcal{O}(n \log ^ 2 V + n \log n)\) 的做法,但被出题人卡掉了。考虑优化。

\(\mathbf{Part3}\) 第一部分的优化

考虑使用 ODT 解决第一部分。我们先预处理出 ODT 中 \(r \leftarrow r + 1\) 时对并集大小的影响(即一个区间加),我们发现若使用主席树维护仍未 \(\mathcal{O}(n \log n \log V)\),不够优秀。考虑差分,由于 \(l\) 每次只会变化 \(1\),在扫描 \(l\) 的同时加上差分数组的贡献即可。总复杂度 \(\mathcal{O}(n (\log n + \log V))\)

UOJ401/P4566

我们发现连续的区间一定要么相离,要么包含,所以极长连续区间形成了树形结构。显然有 \(L_n = n\)。我们发现树的每一层其实是相互独立的,且我们可以把每个点子节点的对应区间视作一个单点,这是因为对于一个值域在 \([x, y]\) 中的连续区间 \([l, r]\),不存在不在区间 \([l, r]\) 中的元素值域在 \([x, y]\) 内,所以我们发现将其视作一个单点,不会影响包含 \([l, r]\) 的区间是否连续。记长度为 \(n\) 满足 \(L = 1, 1, \cdots, 1, n + 1\) 的排列是好排列,个数为 \(f_n\)\(c_i\) 为以 \(i\) 为结尾的极长连续区间在树形结构中的子结点个数,则答案为 \(\prod\limits_{i = 1} ^ n f_{c_i}\)

考虑如何求 \(f\),我们考虑逆排列,我们发现一个长度为 \(n + 1\) 的排列是好的当且仅当其逆排列所有长度 \(\ge 2\) 且不包含 \(n + 1\) 的区间都不连续。考虑递推,从长度为 \(n\) 的排列中插入最小元素。

  • \(2, 3, \cdots, n + 1\) 构成好排列时:只需要 \(1\) 不放在二的两侧,故贡献为 \((n - 1)f_{n - 1}\)
  • \(2, 3, \cdots, n + 1\) 不构成好排列时,则其逆排列至多有一个长度 \(\ge 2\) 且不含 \(n + 1\) 的连续区间。设其逆排列的连续区间值域为 \([l, r]\)。首先有 \(l \ge 3\),因为若 \(l = 2\) 插入 \(1\) 后不可能将该区间消除。其次根据定义显然 \(r \neq n + 1\)。所以对于长度为 \(i\) 的连续区间,可选的值域共有 \(n - i + 1\) 种。先考虑 \(1\) 和连续区间内部的方案数。我们发现可以将连续区间中的元素视为 \(1, 2, \cdots, i\),由于含有 \(1\) 的区间肯定不是连续区间,所以限制条件是没有不含 \(1\) 且长度 \(\ge 2\) 的连续区间。我们发现如果把 \(1\) 视为 \(i + 1\),恰好与好排列的逆排列限制一致,所以内部共 \(f_{i}\) 种排列方法。其次,我们考虑忽略 \(1\),因为若一个长度 \(\ge 2\) 的连续区间包含 \(1\),则必然包含 \(2\),又因为 \(l \ge 3\),且 \(1\) 被插在该连续区间内部,所以包含 \(1\) 的连续区间长度 \(\ge 3\),忽略 \(1\) 后仍存在长度 \(\ge 2\) 的连续区间。且忽略 \(1\) 不会影响 \(n + 1\) 是否存在。其次,我们显然仍可以将该连续区间视作一个单点,这个连续区间和剩下 \(n - i\) 个元素按大小关系可编号为 \(1, 2, \cdots, n - i + 1\),有 \(f_{n - i}\) 种排列方案。综上,贡献为 \((n - i + 1)f_if_{n - i}\)

整理一下,我们有 \(f\) 的递推公式为 \(f_n = (n - 1)f_{n - 1} + \sum\limits_{i = 2} ^ {n - 1}(n - i + 1)f_if_{n - i}\),暴力递推即可得到复杂度 \(\mathcal{O}(n ^ 2 + Tn)\) 的做法。现在问题变成了已知 \(f_1 = 2, f_i = -(i - 3)f_{i - 1} + \sum\limits_{j = 1} ^ {i - 1} (j - 1) f_j f_{i - j}\),求 \(f_1, f_2, \cdots, f_n\)

考虑 \(\max(i, j) \in [L, mid]\) 的二元组 \((i, j)\)\(i + j\) 的贡献。

  1. \(L = 1\) 时,有 \(i, j \in [L, mid]\)\(f_1, f_2, \cdots, f_{mid}\)\(0f_1, 1f_2, \cdots, (mid - 1)f_{mid}\) 卷积即可。
  2. \(L \neq 1\) 时,我们发现 \(R - L < L\),故 \(i, j\) 仅有一个在 \([L, mid]\) 中,将 \(f_L, \cdots, f_{mid}\)\(0f_1, 1f_2, \cdots, (R - L - 1) f_{R - L}\) 卷积,再将 \((L - 1)f_L, Lf_{L + 1}, \cdots, (mid - 1)f_{mid}\)\(f_1, f_2, \cdots, f_{R - L}\) 卷积,再在对应位置贡献即可。

故分治 FFT 即可,复杂度为 \(\mathcal{O}(n \log ^ 2 n)\),总复杂度 \(\mathcal{O}(Tn + n \log ^ 2n)\)

CF1616H

考虑设 \(f_u\) 表示选若干 \(u\) 子树内的数,使其两两 \(\operatorname{xor}\) 不大于 \(x\) 的方案数(只考虑在 \(u\) 以下的位)。我们发现 \(x\) 这一位为 \(0\)\(f_u = f_{ls_u} + f_{rs_u}\),而 \(x\) 这一位为 \(1\) 时我们发现两个子树内部没有限制,而子树间有限制,导致无法转移。

考虑设 \(g_{u, v}\) 表示选 \(u, v\) 两个子树中的数使两者之间的数两两 \(\operatorname{xor}\) 不大于 \(x\) 的方案数,注意,我们只要求一个 \(u\) 子树中选的数与一个 \(v\) 子树中选的数满足 \(\operatorname{xor} \le x\),而不要求 \(u, v\) 子树内部选的数的 \(\operatorname{xor}\) 的大小。边界条件为 \(u = 0\)\(v = 0\) 时答案为 \(2 ^ {sz_u + sz_v}\),递归到了叶子分讨 \(u\) 是否等于 \(v\),为 \(2 ^ {sz_u + sz_v}\)\(2 ^ {sz_u}\)。考虑转移。

  1. \(u = v\)
    • \(x\) 这一位为 \(0\),则只能选一侧子树,答案为 \(g_{ls_u, ls_u} + g_{rs_u, rs_u} - 1\),注意减去空集。
    • \(x\) 这一位为 \(1\),则两侧子树都能选,答案为 \(g_{ls_u, rs_u}\)
    • \(x\) 这一位为 \(0\),则 \(u\) 的左子树和 \(v\) 的右子树不能同时选,\(u\) 的右子树和 \(v\) 的左子树不能同时选。故只能只选一个子树或都选左子树或都选右子树。故答案为 \(g_{ls_u, ls_v} + g_{rs_u, rs_v} - 1 + (2 ^ {sz_{ls_u}} - 1)(2 ^ {sz_{rs_u}} - 1) + (2 ^ {sz_{ls_v}} - 1)(2 ^ {sz_{rs_v}} - 1)\),其中空集被计算了两次,所以需要 \(-1\),四个子树中只有一个有数在 \(g_{ls_u, ls_v} + g_{rs_u, rs_v}\) 中统计。
    • \(x\) 这一位为 \(1\),则我们发现 \(u, v\) 的左子树不会互相影响,\(u, v\) 的右子树不会互相影响,故答案为 \(g_{ls_u, rs_v}g_{ls_v, rs_u}\)

最终题目所求即为 \(g_{1, 1} - 1\),直接搜索进行计算即可。考虑复杂度分析。我们容易发现 \(u = x\)\(v = x\)\((u, v)\) 至多只有 \(1\) 对,故复杂度为 \(\mathcal{O}(n \log V)\)

posted @ 2025-07-20 18:35  DE_aemmprty  阅读(53)  评论(0)    收藏  举报