模拟赛8.14 解题报告
T1. 儒略历
题意:给出 \(n,a_{1...n}\),求四元组 \((A,B,C,D)\) 的个数,满足 \(A<B<C<D\) 且 \(a_A\cdot a_B\cdot a_C=a_D\)。\(1\le n\le10^4\)
额…… \(n\le10^4\) 可以尝试 \(n^2\) 做法。枚举 \(C\),我们可以预处理出前面有多少对 \((A,B)\) 满足 \(a_A\cdot a_B=x\)。再枚举一个 \(D\),就能知道 \(a_A\cdot a_B\) 的值。
时间复杂度 \(O(n^2)\)。
T2. 儒略日(P2107 小Z的AK计划)
题意:有 \(n\) 道题,第 \(i\) 道题的位置为 \(x_i\),你可以在该位置花 \(t_i\) 单位时间切这道题。你一开始在位置 \(0\),移动速度为单位距离/单位时间,求在 \(m\) 单位时间内最多能切多少道题。\(1\le m,x_i\le 10^{18},\space 1\le t_i\le10^9\)
先把位置排序,枚举我们走到了第 \(i\) 道题的位置,此时还剩 \(m-x_i\) 的时间切题。
我们拿一个优先队列,维护当前能切的题,每次检查切题时间是否超过 \(m-x_i\),若是则删除最大的 \(t\)。
T3. 儒略月(P4809 [CCC2018]最大战略储备)
题意:\(n\times m\) 个点排成一个 \(n\) 行 \(m\) 列的二维网格,第 \(i\) 行第 \(j\) 列的点为 \((i,j)\)。有 \(p\) 组行内无向边,第 \(i\) 组有 \(n\) 条,第 \(k\) 条连接 \((k,u_i),(k,v_i)\),权值为 \(w_i\);有 \(q\) 组列内无向边,第 \(i\) 组有 \(m\) 条,第 \(k\) 条连接 \((u_i,k),(v_i,k)\),权值为 \(w_i\)。现在要删除一些边,删除后剩下的图仍然连通,求删除的最大边权和。\(1\le n,m,p,q\le 10^5\)。
首先找出最小生成树的边权和,用总边权和减去其即可。
仍然从 \(\text{Kruskal}\) 的角度求最小生成树。对于行内边,先判断是否有必要加,维护列的并查集即可判断。然后考虑加多少条,通过大量找规律、手动模拟可得,加入的边的数量就是行的并查集所对应的集合个数。列内边同理。
然后就用两个并查集——行并查集、列并查集,维护两个并查集对应多少个集合即可。
T4. 儒略年
题意:有 \(n\) 个数,有 \(k\) 个位置 \(a_1,a_2,...,a_k\) 为 \(1\),其他为 \(0\)。有 \(m\) 个数 \(b_{1...m}\),你可以进行若干次操作,每次选择一个 \(i(1\le i\le m)\),然后选择一个长度为 \(b_i\) 的区间,把区间内所有数取反。求使得所有数变为 \(0\) 的最小操作次数。\(1\le n\le 4\times10^4,\space 1\le k\le11,\space 1\le m\le64\)
考虑差分,设 \(d_{1...n+1}\) 为 \(n\) 个数的差分数组。每次操作一个区间 \([l,r]\) 相当于 \(d_l\leftarrow d_l\operatorname{xor}1,\space d_{r+1}\leftarrow d_{r+1}\operatorname{xor}1\)。
对于 \(d_l,d_{r+1}\) 原来的值,我们分类讨论:
-
\(d_l=0,d_{r+1}=0\),\(d\) 中 \(1\) 的个数 \(+2\)
-
\(d_l=0,d_{r+1}=1\),\(d\) 中 \(1\) 的个数不变
-
\(d_l=1,d_{r+1}=0\),\(d\) 中 \(1\) 的个数不变
-
\(d_l=1,d_{r+1}=1\),\(d\) 中 \(1\) 的个数 \(-2\)
第一种情况我们一定不会操作。考虑图论,在 \(l\) 和 \(r+1\) 之间连接无向边。设 \(dis(u,v)\) 表示点 \(u,v\) 之间的最短路径长度,那么把 \(d_l\leftarrow d_l\operatorname{xor}1,\space d_{r+1}\leftarrow d_{r+1}\operatorname{xor}1\) 的最少步数即为 \(dis(l,r+1)\)。
显然,在借助 \(dis(u,v)\) 的前提下,第二、三种情况我们无需考虑,我们只需要不断利用 \(dis(u,v)\) 来消掉差分数组中的 \(1\)。
由于 \(k\le11\),因此差分数组中 \(1\) 的个数不超过 \(2k\),我们可以状压 \(\text{DP}\)。设 \(f[S]\) 表示此时差分数组中 \(1\) 的位置集合为 \(S\),至少需要多少次操作才能使所有数变成 \(0\)。由于 \(\text{lowbit}(S)\) 一定会被消掉,我们只需要枚举 \(\text{lowbit}(S)\) 与哪个 \(1\) 匹配消除即可。
时间复杂度 \(O(2knm+2^{2k}\cdot 2k)\)。