2022 CSP-S2 复现赛

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−36​04−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 的虫洞。

战火纷飞之中这些虫洞很难长久存在,敌人的打击随时可能到来。这些打击中的有效打击可以分为两类:

  1. 敌人会摧毁某个虫洞,这会使它连接的两个据点无法再通过这个虫洞直接到达,但这样的打击无法摧毁它连接的两个据点。
  2. 敌人会摧毁某个据点,由于虫洞的主要技术集中在出口处,这会导致该据点的所有还未被摧毁的虫洞被一同摧毁。而从这个据点出发的虫洞则不会摧毁

注意:摧毁只会导致虫洞不可用,而不会消除它的存在。

为了抗击敌人并维护各部队和各据点之间的联系,我方发展出了两种特种部队负责修复虫洞:

  • 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】

虫洞状态可以参考下面的图片, 图中的边表示存在且未被摧毁的虫洞:

2022 CSP-S2 复现赛_第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

每台主机处理信息都需要一定的时间,第 ii 台主机处理信息需要 v_ivi​ 单位的时间。数据在网络中的传输非常迅速,因此传输的时间可以忽略不计。据此,上述传输过程花费的时间为 \sum_{i = 1}^{m} v_{c_i}∑i=1m​vci​​。

现在总共有 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的,其实可以优化

你可能感兴趣的:(文件IO,算法,c++)