1.[CSP-S 2022] 假期计划
本题请以文件输入输出方式进行提交,输入输出文件名是
holiday.in
/holiday.out
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
小熊的地图上有 nn 个点,其中编号为 11 的是它的家、编号为 2, 3, \ldots, n2,3,…,n 的都是景点。部分点对之间有双向直达的公交线路。如果点 xx 与 z_1z1、z_1z1 与 z_2z2、……、z_{k - 1}zk−1 与 z_kzk、z_kzk 与 yy 之间均有直达的线路,那么我们称 xx 与 yy 之间的行程可转车 kk 次通达;特别地,如果点 xx 与 yy 之间有直达的线路,则称可转车 00 次通达。
很快就要放假了,小熊计划从家出发去 44 个不同的景点游玩,完成 55 段行程后回家:家 \to→ 景点 A \to→ 景点 B \to→ 景点 C \to→ 景点 D \to→ 家且每段行程最多转车 kk 次。转车时经过的点没有任何限制,既可以是家、也可以是景点,还可以重复经过相同的点。例如,在景点 A \to→ 景点 B 的这段行程中,转车时经过的点可以是家、也可以是景点 C,还可以是景点 D \to→ 家这段行程转车时经过的点。
假设每个景点都有一个分数,请帮小熊规划一个行程,使得小熊访问的四个不同景点的分数之和最大。
输入格式
第一行包含三个正整数 n, m, kn,m,k,分别表示地图上点的个数、双向直达的点对数量、每段行程最多的转车次数。
第二行包含 n - 1n−1 个正整数,分别表示编号为 2, 3, \ldots, n2,3,…,n 的景点的分数。
接下来 mm 行,每行包含两个正整数 x, yx,y,表示点 xx 和 yy 之间有道路直接相连,保证 1 \le x, y \le n1≤x,y≤n,且没有重边,自环。
输出格式
输出一个正整数,表示小熊经过的 44 个不同景点的分数之和的最大值。
样例 #1
样例输入 #1
8 8 1
9 7 1 8 2 3 6
1 2
2 3
3 4
4 5
5 6
6 7
7 8
8 1
Copy
样例输出 #1
27
Copy
样例 #2
样例输入 #2
7 9 0
1 1 1 2 3 4
1 2
2 3
3 4
1 5
1 6
1 7
5 4
6 4
7 4
Copy
样例输出 #2
7
Copy
提示
【样例解释 #1】
当计划的行程为 1 \to 2 \to 3 \to 5 \to 7 \to 11→2→3→5→7→1 时,44 个景点的分数之和为 9 + 7 + 8 + 3 = 279+7+8+3=27,可以证明其为最大值。
行程 1 \to 3 \to 5 \to 7 \to 8 \to 11→3→5→7→8→1 的景点分数之和为 2424、行程 1 \to 3 \to 2 \to 8 \to 7 \to 11→3→2→8→7→1 的景点分数之和为 2525。它们都符合要求,但分数之和不是最大的。
行程 1 \to 2 \to 3 \to 5 \to 8 \to 11→2→3→5→8→1 的景点分数之和为 3030,但其中 5 \to 85→8 至少需要转车 22 次,因此不符合最多转车 k = 1k=1 次的要求。
行程 1 \to 2 \to 3 \to 2 \to 3 \to 11→2→3→2→3→1 的景点分数之和为 3232,但游玩的并非 44 个不同的景点,因此也不符合要求。
【样例 #3】
见附件中的 holiday/holiday3.in
与 holiday/holiday3.ans
。
【数据范围】
对于所有数据,保证 5 \le n \le 25005≤n≤2500,1 \le m \le 100001≤m≤10000,0 \le k \le 1000≤k≤100,所有景点的分数 1 \le s_i \le {10}^{18}1≤si≤1018。保证至少存在一组符合要求的行程。
测试点编号 | n \len≤ | m \lem≤ | k \lek≤ |
---|---|---|---|
1 \sim 31∼3 | 1010 | 2020 | 00 |
4 \sim 54∼5 | 1010 | 2020 | 55 |
6 \sim 86∼8 | 2020 | 5050 | 100100 |
9 \sim 119∼11 | 300300 | 10001000 | 00 |
12 \sim 1412∼14 | 300300 | 10001000 | 100100 |
15 \sim 1715∼17 | 25002500 | 1000010000 | 00 |
18 \sim 2018∼20 | 25002500 | 1000010000 | 100100 |
2.[CSP-S 2022] 策略游戏
本题请以文件输入输出方式进行提交,输入输出文件名是
game.in
/game.out
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
小 L 和小 Q 在玩一个策略游戏。
有一个长度为 nn 的数组 AA 和一个长度为 mm 的数组 BB,在此基础上定义一个大小为 n \times mn×m 的矩阵 CC,满足 C_{i j} = A_i \times B_jCij=Ai×Bj。所有下标均从 11 开始。
游戏一共会进行 qq 轮,在每一轮游戏中,会事先给出 44 个参数 l_1, r_1, l_2, r_2l1,r1,l2,r2,满足 1 \le l_1 \le r_1 \le n1≤l1≤r1≤n、1 \le l_2 \le r_2 \le m1≤l2≤r2≤m。
游戏中,小 L 先选择一个 l_1 \sim r_1l1∼r1 之间的下标 xx,然后小 Q 选择一个 l_2 \sim r_2l2∼r2 之间的下标 yy。定义这一轮游戏中二人的得分是 C_{x y}Cxy。
小 L 的目标是使得这个得分尽可能大,小 Q 的目标是使得这个得分尽可能小。同时两人都是足够聪明的玩家,每次都会采用最优的策略。
请问:按照二人的最优策略,每轮游戏的得分分别是多少?
输入格式
第一行输入三个正整数 n, m, qn,m,q,分别表示数组 AA,数组 BB 的长度和游戏轮数。
第二行:nn 个整数,表示 A_iAi,分别表示数组 AA 的元素。
第三行:mm 个整数,表示 B_iBi,分别表示数组 BB 的元素。
接下来 qq 行,每行四个正整数,表示这一次游戏的 l_1, r_1, l_2, r_2l1,r1,l2,r2。
输出格式
输出共 qq 行,每行一个整数,分别表示每一轮游戏中,小 L 和小 Q 在最优策略下的得分。
样例 #1
样例输入 #1
3 2 2
0 1 -2
-3 4
1 3 1 2
2 3 2 2
Copy
样例输出 #1
0
4
Copy
样例 #2
样例输入 #2
6 4 5
3 -1 -2 1 2 0
1 2 -1 -3
1 6 1 4
1 5 1 4
1 4 1 2
2 6 3 4
2 5 2 3
Copy
样例输出 #2
0
-2
3
2
-1
Copy
提示
【样例解释 #1】
这组数据中,矩阵 CC 如下:
\begin{bmatrix} 0 & 0 \\ -3 & 4 \\ 6 & -8 \end{bmatrix}⎣⎢⎡0−3604−8⎦⎥⎤
在第一轮游戏中,无论小 L 选取的是 x = 2x=2 还是 x = 3x=3,小 Q 都有办法选择某个 yy 使得最终的得分为负数。因此小 L 选择 x = 1x=1 是最优的,因为这样得分一定为 00。
而在第二轮游戏中,由于小 L 可以选 x = 2x=2,小 Q 只能选 y = 2y=2,如此得分为 44。
【样例 #3】
见附件中的 game/game3.in
与 game/game3.ans
。
【样例 #4】
见附件中的 game/game4.in
与 game/game4.ans
。
【数据范围】
对于所有数据,1 \le n, m, q \le {10}^51≤n,m,q≤105,-{10}^9 \le A_i, B_i \le {10}^9−109≤Ai,Bi≤109。对于每轮游戏而言,1 \le l_1 \le r_1 \le n1≤l1≤r1≤n,1 \le l_2 \le r_2 \le m1≤l2≤r2≤m。
测试点编号 | n, m, q \len,m,q≤ | 特殊条件 |
---|---|---|
11 | 200200 | 1, 2 |
22 | 200200 | 1 |
33 | 200200 | 2 |
4 \sim 54∼5 | 200200 | 无 |
66 | 10001000 | 1, 2 |
7 \sim 87∼8 | 10001000 | 1 |
9 \sim 109∼10 | 10001000 | 2 |
11 \sim 1211∼12 | 10001000 | 无 |
1313 | {10}^5105 | 1, 2 |
14 \sim 1514∼15 | {10}^5105 | 1 |
16 \sim 1716∼17 | {10}^5105 | 2 |
18 \sim 2018∼20 | {10}^5105 | 无 |
其中,特殊性质 1 为:保证 A_i, B_i > 0Ai,Bi>0。
特殊性质 2 为:保证对于每轮游戏而言,要么 l_1 = r_1l1=r1,要么 l_2 = r_2l2=r2。
3.[CSP-S 2022] 星战
本题请以文件输入输出方式进行提交,输入输出文件名是
galaxy.in
/galaxy.out
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
在这一轮的星际战争中,我方在宇宙中建立了 nn 个据点,以 mm 个单向虫洞连接。我们把终点为据点 uu 的所有虫洞归为据点 uu 的虫洞。
战火纷飞之中这些虫洞很难长久存在,敌人的打击随时可能到来。这些打击中的有效打击可以分为两类:
- 敌人会摧毁某个虫洞,这会使它连接的两个据点无法再通过这个虫洞直接到达,但这样的打击无法摧毁它连接的两个据点。
- 敌人会摧毁某个据点,由于虫洞的主要技术集中在出口处,这会导致该据点的所有还未被摧毁的虫洞被一同摧毁。而从这个据点出发的虫洞则不会摧毁。
注意:摧毁只会导致虫洞不可用,而不会消除它的存在。
为了抗击敌人并维护各部队和各据点之间的联系,我方发展出了两种特种部队负责修复虫洞:
- A 型特种部队则可以将某个特定的虫洞修复。
- B 型特种部队可以将某据点的所有损坏的虫洞修复。
考虑到敌人打击的特点,我方并未在据点上储备过多的战略物资。因此只要这个据点的某一条虫洞被修复,处于可用状态,那么这个据点也是可用的。
我方掌握了一种苛刻的空间特性,利用这一特性我方战舰可以沿着虫洞瞬移到敌方阵营,实现精确打击。
为了把握发动反攻的最佳时机,指挥部必须关注战场上的所有变化,为了寻找一个能够进行反攻的时刻。总指挥认为:
- 如果从我方的任何据点出发,在选择了合适的路线的前提下,可以进行无限次的虫洞穿梭(可以多次经过同一据点或同一虫洞),那么这个据点就可以实现反击。
- 为了使虫洞穿梭的过程连续,尽量减少战舰在据点切换虫洞时的质能损耗,当且仅当只有一个从该据点出发的虫洞可用时,这个据点可以实现连续穿梭。
- 如果我方所有据点都可以实现反击,也都可以实现连续穿梭,那么这个时刻就是一个绝佳的反攻时刻。
总司令为你下达命令,要求你根据战场上实时反馈的信息,迅速告诉他当前的时刻是否能够进行一次反攻。
输入格式
输入的第一行包含两个正整数 n,mn,m。
接下来 mm 行每行两个数 u,vu,v,表示一个从据点 uu 出发到据点 vv 的虫洞。保证 u \ne vu=v,保证不会有两条相同的虫洞。初始时所有的虫洞和据点都是完好的。
接下来一行一个正整数 qq 表示询问个数。
接下来 qq 行每行表示一次询问或操作。首先读入一个正整数 tt 表示指令类型:
- 若 t = 1t=1,接下来两个整数 u, vu,v 表示敌人摧毁了从据点 uu 出发到据点 vv 的虫洞。保证该虫洞存在且未被摧毁。
- 若 t = 2t=2,接下来一个整数 uu 表示敌人摧毁了据点 uu。如果该据点的虫洞已全部 被摧毁,那么这次袭击不会有任何效果。
- 若 t = 3t=3,接下来两个整数 u, vu,v 表示我方修复了从据点 uu 出发到据点 vv 的虫洞。保证该虫洞存在且被摧毁。
- 若 t = 4t=4,接下来一个整数 uu 表示我方修复了据点 uu。如果该据点没有被摧毁的虫洞,那么这次修复不会有任何效果。
在每次指令执行之后,你需要判断能否进行一次反攻。如果能则输出 YES
否则输出 NO
。
输出格式
输出一共 qq 行。对于每个指令,输出这个指令执行后能否进行反攻。
样例 #1
样例输入 #1
3 6
2 3
2 1
1 2
1 3
3 1
3 2
11
1 3 2
1 2 3
1 1 3
1 1 2
3 1 3
3 3 2
2 3
1 3 1
3 1 3
4 2
1 3 2
Copy
样例输出 #1
NO
NO
YES
NO
YES
NO
NO
NO
YES
NO
NO
Copy
提示
【样例解释 #1】
虫洞状态可以参考下面的图片, 图中的边表示存在且未被摧毁的虫洞:
【样例 #2】
见附件中的 galaxy/galaxy2.in
与 galaxy/galaxy2.ans
。
【样例 #3】
见附件中的 galaxy/galaxy3.in
与 galaxy/galaxy3.ans
。
【样例 #4】
见附件中的 galaxy/galaxy4.in
与 galaxy/galaxy4.ans
。
【数据范围】
对于所有数据保证:1 \le n \le 5 \times {10}^51≤n≤5×105,1 \le m \le 5 \times {10}^51≤m≤5×105,1 \le q \le 5 \times {10}^51≤q≤5×105。
测试点 | n \len≤ | m \lem≤ | q \leq≤ | 特殊限制 |
---|---|---|---|---|
1 \sim 31∼3 | 1010 | 2020 | 5050 | 无 |
4 \sim 84∼8 | {10}^3103 | {10}^4104 | {10}^3103 | 无 |
9 \sim 109∼10 | 5 \times {10}^55×105 | 5 \times {10}^55×105 | 5 \times {10}^55×105 | 保证没有 t = 2t=2 和 t = 4t=4 的情况 |
11 \sim 1211∼12 | 5 \times {10}^55×105 | 5 \times {10}^55×105 | 5 \times {10}^55×105 | 保证没有 t = 4t=4 的情况 |
13 \sim 1613∼16 | {10}^5105 | 5 \times {10}^55×105 | 5 \times {10}^55×105 | 无 |
17 \sim 2017∼20 | 5 \times {10}^55×105 | 5\times 10^55×105 | 5 \times {10}^55×105 | 无 |
4.[CSP-S 2022] 数据传输
本题请以文件输入输出方式进行提交,输入输出文件名是
transmit.in
/transmit.out
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
题目描述
小 C 正在设计计算机网络中的路由系统。
测试用的网络总共有 nn 台主机,依次编号为 1 \sim n1∼n。这 nn 台主机之间由 n - 1n−1 根网线连接,第 ii 条网线连接个主机 a_iai 和 b_ibi。保证任意两台主机可以通过有限根网线直接或者间接地相连。受制于信息发送的功率,主机 aa 能够直接将信息传输给主机 bb 当且仅当两个主机在可以通过不超过 kk 根网线直接或者间接的相连。
在计算机网络中,数据的传输往往需要通过若干次转发。假定小 C 需要将数据从主机 aa 传输到主机 bb(a \neq ba=b),则其会选择出若干台用于传输的主机 c_1 = a, c_2, \ldots, c_{m - 1}, c_m = bc1=a,c2,…,cm−1,cm=b,并按照如下规则转发:对于所有的 1 \le i < m1≤i<m,主机 c_ici 将信息直接发送给 c_{i + 1}ci+1。
每台主机处理信息都需要一定的时间,第 ii 台主机处理信息需要 v_ivi 单位的时间。数据在网络中的传输非常迅速,因此传输的时间可以忽略不计。据此,上述传输过程花费的时间为 \sum_{i = 1}^{m} v_{c_i}∑i=1mvci。
现在总共有 qq 次数据发送请求,第 ii 次请求会从主机 s_isi 发送数据到主机 t_iti。小 C 想要知道,对于每一次请求至少需要花费多少单位时间才能完成传输。
输入格式
输入的第一行包含三个正整数 n, Q, kn,Q,k,分别表示网络主机个数,请求个数,传输参数。数据保证 1 \le n \le 2 \times {10}^51≤n≤2×105,1 \le Q \le 2 \times {10}^51≤Q≤2×105,1 \le k \le 31≤k≤3。
输入的第二行包含 nn 个正整数,第 ii 个正整数表示 v_ivi,保证 1 \le v_i \le {10}^91≤vi≤109。
接下来 n - 1n−1 行,第 ii 行包含两个正整数 a_i, b_iai,bi,表示一条连接主机 a_i, b_iai,bi 的网线。保证 1 \le a_i, b_i \le n1≤ai,bi≤n。
接下来 QQ 行,第 ii 行包含两个正整数 s_i, t_isi,ti,表示一次从主机 s_isi 发送数据到主机 t_iti 的请求。保证 1 \le s_i, t_i \le n1≤si,ti≤n,s_i \ne t_isi=ti。
输出格式
QQ 行,每行一个正整数,表示第 ii 次请求在传输的时候至少需要花费多少单位的时间。
样例 #1
样例输入 #1
7 3 3
1 2 3 4 5 6 7
1 2
1 3
2 4
2 5
3 6
3 7
4 7
5 6
1 2
Copy
样例输出 #1
12
12
3
Copy
提示
【样例解释 #1】
对于第一组请求,由于主机 4, 74,7 之间需要至少 44 根网线才能连接,因此数据无法在两台主机之间直接传输,其至少需要一次转发;我们让其在主机 11 进行一次转发,不难发现主机 11 和主机 4, 74,7 之间都只需要两根网线即可连接,且主机 11 的数据处理时间仅为 11,为所有主机中最小,因此最少传输的时间为 4 + 1 + 7 = 124+1+7=12。
对于第三组请求,由于主机 1, 21,2 之间只需要 11 根网线就能连接,因此数据直接传输就是最优解,最少传输的时间为 1 + 2 = 31+2=3。
【样例 #2】
见附件中的 transmit/transmit2.in
与 transmit/transmit2.ans
。
该样例满足测试点 22 的限制。
【样例 #3】
见附件中的 transmit/transmit3.in
与 transmit/transmit3.ans
。
该样例满足测试点 33 的限制。
【样例 #4】
见附件中的 transmit/transmit4.in
与 transmit/transmit4.ans
。
该样例满足测试点 2020 的限制。
【数据范围】
对于所有的测试数据,满足 1 \le n \le 2 \times {10}^51≤n≤2×105,1 \le Q \le 2 \times {10}^51≤Q≤2×105,1 \le k \le 31≤k≤3,1 \le a_i, b_i \le n1≤ai,bi≤n,1 \le s_i, t_i \le n1≤si,ti≤n,s_i \ne t_isi=ti。
测试点 | n \len≤ | Q \leQ≤ | k =k= | 特殊性质 |
---|---|---|---|---|
11 | 1010 | 1010 | 22 | 是 |
22 | 1010 | 1010 | 33 | 是 |
33 | 200200 | 200200 | 22 | 是 |
4 \sim 54∼5 | 200200 | 200200 | 33 | 是 |
6 \sim 76∼7 | 20002000 | 20002000 | 11 | 否 |
8 \sim 98∼9 | 20002000 | 20002000 | 22 | 否 |
10 \sim 1110∼11 | 20002000 | 20002000 | 33 | 否 |
12 \sim 1312∼13 | 2 \times {10}^52×105 | 2 \times {10}^52×105 | 11 | 否 |
1414 | 5 \times {10}^45×104 | 5 \times {10}^45×104 | 22 | 是 |
15 \sim 1615∼16 | {10}^5105 | {10}^5105 | 22 | 是 |
17 \sim 1917∼19 | 2 \times {10}^52×105 | 2 \times {10}^52×105 | 22 | 否 |
2020 | 5 \times {10}^45×104 | 5 \times {10}^45×104 | 33 | 是 |
21 \sim 2221∼22 | {10}^5105 | {10}^5105 | 33 | 是 |
23 \sim 2523∼25 | 2 \times {10}^52×105 | 2 \times {10}^52×105 | 33 | 否 |
特殊性质:保证 a_i = i + 1ai=i+1,而 b_ibi 则从 1, 2, \ldots, i1,2,…,i 中等概率选取。
赛题讲解
回放:https://www.topscoding.com/video/635e95a42e0ba79e2e3fd251
假期计划
这种题可以看成是多个不同的部分嵌套起来的。
第一步是求出每个点在k+1k+1步内可以到另外的哪些点,存进一个矩阵g[n][n]g[n][n]中
这一步非常简单,只需要从点ii开始BFS搜索即可。
第二步是求答案,因为小熊需要途径44个中间结点,但是nn的大小是25002500,只能承受途径两个结点的情况,这种问题很明显是非常经典的中途相遇法。
用f[i][j]f[i][j]表示从家出发,先经过ii再经过jj,得到的得分。如果不能从家出发经过i,ji,j,则为-1−1。可以发现求出f[i][j]f[i][j]是非常容易的,只需要判断家,i,j,i,j可不可达即可。那么答案等于max(f[i][j]+f[x][y])max(f[i][j]+f[x][y])(g[j][y]=1g[j][y]=1,前两个不等于后两个)。
对于i,ji,j我们可以枚举,接着怎么求解x,yx,y的最大值呢?
为了维护f[x][y]f[x][y]的最大值,我们需要让x,yx,y既不等于ii,也不等于jj,在预处理g[n][n]g[n][n]时,只要g[j][j]=0g[j][j]=0,就可以避免y=jy=j,接着,对于所有g[j][y]=1g[j][y]=1的yy,可以用前缀和和后缀和预处理出来三个不同xx情况下的f[x][y]f[x][y]的最大值。这时只需要在y=iy=i处断开一下,就能不考虑y=iy=i,然后如果最大值的x=ix=i或者等于jj,就看次大值,如果次大值的x=ix=i或者x=jx=j,那么看三大值,由于处理出来的是不同的三个xx,所以看三大值时肯定可行。
时间复杂度O(n(n+m))O(n(n+m))预处理距离O(n^2)O(n2)预处理前缀和O(n^2)O(n2)回答
策略游戏
如果小LL选了一个正数,那么小QQ就会选一个尽量小的数,如果小LL选了一个负数,那么小QQ就会选一个尽量大的数,如果小LL选00,小QQ无论选什么答案都是00。
因此对每个询问,预处理小QQ能选的区间中最小的数MINMIN和最大的数MAXMAX。然后分类讨论:
如果小QQ能选的最小的数是一个负数,且小QQ能选的最大的数是一个正数,意味着小LL无论选再大的正数,或者再小的负数,局面都会被小QQ翻转,因此小LL会选择00,如果没有00,就会选最靠近00的正数或者负数,只需要比较小LL能选的区间中,最靠近零的正数乘以MINMIN和最靠近零的负数乘以MAXMAX哪个更大即可知道答案。
如果小QQ能选的最小的数是一个负数,且小QQ能选的最大的数也是一个负数。那小LL肯定会优先选取负数,取最小的负数即可,如果取不到,则小LL只能取正数或00,此时小QQ会选择最小的负数,使他更小,因此这时要选择最靠近00的正数,其实就是最小的数。
如果小QQ能选的最小的数是一个正数,且小QQ能选的最大的数也是一个正数。那小LL肯定会优先选取正数,选择区间中最大的正数即可,如果取不到,则小LL只能取负数或00,此时小QQ会选最大的负数使他更小,这时要选最靠近00的负数,其实就是最大的数。
如果小QQ能选的最小的数是一个正数,且小QQ能选的最大的数是一个负数。这种情况不存在。
小QQ能选的为00包含在其中任何一种讨论都可以。
利用区间RMQ处理AA和BB,每次回答可以做到O(\log n+\log m)O(logn+logm)
星战
能够进行反攻,当且仅当每个点都有且仅有一条出边。也就是说,对于所有的据点,形成了一个基环内向森林。
所以我们需要设法维护当前存在虫洞的入口构成的可重集合。当且仅当这个虫洞入口构成的可重集合中,每个1\sim n1∼n各仅出现了一次,才是可以反攻的。
如果只有11操作和33操作,每次只会增加或者删除一条边,维护起来相对轻松,直接用桶就可以实现维护了。
现在有22和44操作,每次可能会改变较多的边,如果还是暴力加边或者删边,可能会超时。我们想个办法解决这个问题。
由于它说每个边实质上是在它的终点处,所以我们得把这个和上面提到的东西结合起来。我们用字符串哈希维护每个据点的所有入边的起点集合。用另一个字符串哈希值表示目前哪些边是存在的。那么每次22或者44操作,就相当于是给哈希值加上或减去一个数。对整体再用一个哈希值维护1\sim n1∼n各仅出现一次对应的哈希值。如果所有结点哈希值相加不等于整体的哈希值,那么结果为NONO,否则为YESYES。
实现起来每次操作是O(1)O(1)的,整体是O(n+m+q)O(n+m+q)
数据传输
注意到kk很小,我们从这个入手。
对于一条路径,它肯定整体节奏是向上走的,但是也可能会向下走一步走到儿子,再向上走两步向下走一步走到它父亲的父亲的儿子。这种情况很多人都没考虑到。
先考虑只有一组询问的情况,从ss到tt。根据经验,我们可以把这个路径拆成ss到LCALCA,再从LCALCA到tt
所以我们怎么设状态呢?可以设f[i][j]f[i][j]表示从ss开始,向上走到离ii距离为jj的点,所花费的最小时间。
初始状态f[s][0] = v_sf[s][0]=vs,其他等于+\infin+∞
转移的话,沿着s\rightarrow LCAs→LCA的路径,可以发现走到的点不会游离出这条路径一格以外,否则将毫无意义。设这条路径上相邻的四个点为x,y,z,ax,y,z,a(xx是yy父亲,yy是zz父亲,zz是aa父亲),以k=3k=3为例,有f[x][0] = min(f[y][1],f[y][0],f[z][1],f[z][0],f[a][0])f[x][0]=min(f[y][1],f[y][0],f[z][1],f[z][0],f[a][0]),f[x][1]=min(f[y][0],f[y][1],f[z][0])f[x][1]=min(f[y][0],f[y][1],f[z][0])。对ss和tt分别跑dp,时间复杂度O(n)O(n)。
现在考虑进阶版,动态询问。我们有类似的经验,用倍增去维护即可。实现略有细节
时间复杂度O(n+k^3q\log n)O(n+k3qlogn),我的代码是k^4k4的,其实可以优化