luogu#P11944. [KTSC 2025] 路网维修 / roadwork

    ID: 36159 远端评测题 2000ms 1024MiB 尝试: 0 已通过: 0 难度: 3 上传者: 标签>2025交互题Special JudgeKOI(韩国)

[KTSC 2025] 路网维修 / roadwork

题目背景

版权信息:译自 2025年度 国际情报 올림피아드 (Olympiad) 代表学生 选拔考试 R1T3。[CC BY-NC-SA 4.0]

题目描述

有一条自西向东流的大河,河的南北两岸各有 nn 个村庄。北岸的村庄自西向东编号 A1AnA_1\sim A_n,南岸的村庄自西向东编号 B1BnB_1\sim B_n

(2n1)(2n-1) 座桥梁,每座桥梁连接一个南岸村庄和北岸村庄。

具体地说,给定一个长为 (2n2)(2n-2) 的字符串 ss,字符集为 {A,B}\{\texttt{A},\texttt{B}\}

  • 00 座桥连接 A1,B1A_1,B_1
  • 0i<2n2\forall 0\le i\lt 2n-2,设第 ii 座桥连接 Ax,ByA_x,B_y
    • si=As_i=\texttt{A},则第 (i+1)(i+1) 座桥连接 Ax,By+1A_x,B_{y+1}
    • si=Bs_i=\texttt{B},则第 (i+1)(i+1) 座桥连接 Ax+1,ByA_{x+1},B_{y}

数据保证,ss 中恰好有 (n1)(n-1)A\texttt{A}(n1)(n-1)B\texttt{B},由此可以导出以下性质:

  1. 不存在一条座桥梁,连接了不存在的村庄;
  2. 任意两座村庄均通过桥梁连通;
  3. (2n2)(2n-2) 座桥(即最后一座桥)连接 An,BnA_n,B_n

现在要维修若干座桥梁,前提是:

  • 任意一座村庄至多只有一条桥梁被维修。

计算:

  1. 在满足以上条件的前提下,至多能维修多少座桥梁。
  2. 在满足 1 的前提下,有多少个不同的维修方案。

两个方案不同,当且仅当选择桥梁的集合不同。只需要将第二问的答案对 (109+7)(10^9+7) 取模。

特别地,如果你只回答第一问,也可以得到部分分,详见【计分方式】。

实现细节

你不需要,也不应该实现 main 函数。

你应当实现以下的函数:

array<int, 2> roadwork(string s);
  • s:长度为 (2n2)(2n-2) 的字符串 ss
  • 返回一个数组,第一个元素表示至多能维修多少座桥梁;第二个元素表示方案数对 (109+7)(10^9+7) 取模后的结果(落在区间 [0,109+7)[0,10^9+7) 内)。
  • 该函数将被调用 TT 次,其中 TT 为测试数据组数。

输入格式

本题单个测试点内有多组测试数据。

Sample Grader 输入格式如下:

第一行,一个正整数 TT

接下来 TT 行,每行一个正整数 nn 和一个长度为 (2n2)(2n-2) 的字符串 ss

输出格式

Sample Grader 输出 TT 行,每行两个整数,表示对应数据的答案。

1
2 AB
2 1
1
7 AABBAABBAABB
6 4

提示

样例交互

样例交互 11

roadwork("AB");

显然至多能维修两座桥梁((A1,B1),(A2,B2)(A_1,B_1),(A_2,B_2)),且这是唯一的方案。所以返回 [2,1][2,1]

如果返回 [2,1],[2,0][2,-1],[2,0] 等,将得到 40%40\% 的分数。

样例交互 22

roadwork("AABBAABBAABB")

至多维修 66 座桥梁,有 44 种方式。所以返回 [6,4][6,4]

数据范围

  • 1T101\le T\le 10
  • 21n2212^1\le n\le 2^{21}
  • ss 中恰好有 (n1)(n-1)A\texttt{A}(n1)(n-1)B\texttt{B}

子任务

子任务 00 为样例。

子任务编号 nn\le 得分
11 212^{1} 44
22 232^{3} 55
33 252^{5} 66
44 272^{7} 77
55 292^{9} 88
66 2112^{11} 99
77 2132^{13} 1010
88 2152^{15} 1111
99 2172^{17} 1212
1010 2192^{19} 1313
1111 2212^{21} 1515

计分方式

如果你正确回答第一问,可以获得 40%40\% 的分数。

在此前提下,如果你正确回答第二问,可以额外获得 60%60\% 的分数。