2021年第45周总结
11.10
第45届ICPC区域赛济南站
Problem A
根据题目定义, Z i j Z_{ij} Zij可以写成 Z i j = ⊕ k = 1 N A i , k C k , j Z_{ij} = \oplus_{k=1}^{N}A_{i,k}C_{k,j} Zij=⊕k=1NAi,kCk,j。而 D i j = B i , j C i j D_{ij}=B_{i,j}C_{ij} Dij=Bi,jCij,令等式左右相等,即为一个异或方程组,使用线性基求解这个异或方程组,求出每一列的自由变量的个数,每一列的方案即为 2 n 2^n 2n,其中 n n n为自由变量的个数,再将每一列乘起来即可。
难点&思路:异或方程组+线性基。
11.11
CF 1029E
树上贪心,需要自底向上贪心,考虑拓扑排序,首先将度为 1 1 1的点加入队列,依次考虑队列中的节点,如果队列中的点不能满足路径要求,则将这个点的父节点连接一条从 1 1 1到父节点的边,这样做一定是最优的,连接到父节点还能对兄弟节点进行贡献。
思路:拓扑排序。
难点:贪心。
ABC226B
使用位Hash一定要排除 a i = 0 a_i=0 ai=0的情况。
11.12
第45届ICPC区域赛济南站
Problem J
二分图构造。
首先一颗树是一个二分图,且二分图的一边的边数不会超过 n 2 \frac{n}{2} 2n,首先我们将二分图左边的最后两位置为 10 10 10右边置为 01 01 01,这样可以保证每一侧不会存在边。然后考虑边数较小的那个部分,将第 i i i个设置为全集减去第 i + 2 i+2 i+2位,这样就对应一个钥匙扣,只有右边该位为 1 1 1的才会与他相连,那么我们遍历右边的节点,对于每个节点,考虑与他相连的节点 j j j,将位 j + 2 j+2 j+2设置为 1 1 1,即可。
难点&思路:构造+二分图。
11.14
LC 65双周赛
Problem D
首先这是一个决策单调性问题,外层框架考虑二分。子问题为判断
k
k
k个工人是否能够满足
k
k
k个任务。我们想让工人的能量尽量不能浪费,药品的作用尽量不能浪费。我们考虑使用multiset
或者单调队列来维护这个信息。
思路:二分。
难点:贪心匹配问题。
ABC 227
Problem C
神奇的 O ( n 2 3 ) O(n^{\frac{2}{3}}) O(n32)枚举算法。
求出 A B C ≤ N ABC \leq N ABC≤N的三元组 ( A , B , C ) (A,B,C) (A,B,C)的个数( 1 ≤ A ≤ B ≤ C ≤ N 1 \leq A \leq B \leq C \leq N 1≤A≤B≤C≤N)。
比赛时看到 N ≤ 1 0 11 N \leq 10^{11} N≤1011,能猜到应该是根号算法或者类根号算法,但是想不出来。
考虑三元组的有序性, A A A的取值应该在 1 ≤ A ≤ N 3 1 \leq A \leq \sqrt[3]{N} 1≤A≤3N, B B B在 A ≤ B ≤ N A A \leq B \leq \sqrt{\frac{N}{A}} A≤B≤AN, C C C在 B ≤ C ≤ N A B B \leq C \leq \frac{N}{AB} B≤C≤ABN。
发现内层的 C C C循环次数是 N A B − B + 1 \frac{N}{AB} - B + 1 ABN−B+1次,因此可以直接去掉 C C C的循环。
ll ans = 0;
for (ll a = 1; a * a * a <= n; a++)
for (ll b = a; b * b * a <= n; b++)
ans += n / (a * b) - b + 1;
很显然时间复杂度取决于循环的执行次数为 ∑ A = 1 N 3 N A − A + 1 \sum_{A=1}^{\sqrt[3]{N}} \sqrt{\frac{N}{A}} - A + 1 ∑A=13NAN−A+1,考虑积分估计。
∑ A = 2 N 3 ( N A − A + 1 ) ≤ ∫ 1 N 3 ( N A − A + 1 ) d A ≈ O ( N 2 3 ) \sum _{A=2}^{\sqrt[3]{N}} \left(\sqrt{\frac{N}{A}}-A+1 \right) \leq \int_{1}^{\sqrt[3]{N}}\left(\sqrt{\frac{N}{A}}-A+1 \right)dA \approx O(N^{\frac{2}{3}}) A=2∑3N(AN−A+1)≤∫13N(AN−A+1)dA≈O(N32)
Problem D
仍然是一道决策性单调问题,外层框架仍使用二分去取是否可以安排 P P P个任务。
每次check
我们都考虑和式
s
=
∑
i
=
1
n
min
(
P
,
A
i
)
s = \sum_{i=1}^{n} \min(P,A_i)
s=∑i=1nmin(P,Ai),如果
s
≥
K
×
P
s \geq K \times P
s≥K×P那么
P
P
P个任务就是可安排的,
min
(
P
,
A
i
)
\min(P,A_i)
min(P,Ai)相当于对
P
P
P个任务的贡献度。