#P12734. [GCJ 2020 #2] Emacs++
[GCJ 2020 #2] Emacs++
题目描述
在 2016 年的 Distributed Code Jam 中,我们为偏爱更高密度括号的 Lisp 爱好者推出了 Lisp++ 语言。以下是该语言语法规则的回顾:
一个 Lisp++ 程序是一个由平衡括号组成的字符串。更正式地说,Lisp++ 程序由以下任意一种形式构成(在此规范中, 代表某段程序代码——每次出现时不一定相同):
()
:字面上仅包含一个左括号和一个右括号。我们说这个(
匹配这个)
,反之亦然。(C)
:被一对括号包裹的程序。我们说这个(
匹配这个)
,反之亦然。- :两个程序(不一定相同)连续拼接。
今年,我们很高兴推出 Emacs++,一款专为 Lisp++ 设计的文本查看器。Emacs++ 将长度为 的 Lisp++ 程序显示为一行长文本,并带有一个可移动的光标。光标是一个“块光标”,始终位于程序的 个字符之一上,而非字符之间。
在任何时刻,你可以执行以下三种操作之一来移动光标( 表示光标的当前位置,从最左侧位置开始计数为 1):
- 将光标向左移动一个字符(若光标已在最左侧字符则不做任何操作)。此操作耗时 秒。
- 将光标向右移动一个字符(若光标已在最右侧字符则不做任何操作)。此操作耗时 秒。
- 将光标传送到与第 个字符的括号(如上所述)匹配的括号处。此操作耗时 秒。
我们认为 Emacs++ 对高级用户来说很简单,但仍需了解其效率。我们有一个 Lisp++ 程序和关于该程序的 个查询;每个查询包含一个起始位置 和一个目标位置 。为了回答第 个查询,你需要确定在最优决策下,将光标从位置 移动到位置 所需的最小时间 (以秒为单位)。
请输出所有 值的总和。
输入格式
输入的第一行包含测试用例的数量 。随后是 个测试用例。每个测试用例的第一行包含两个整数 (表示 Lisp++ 程序的长度)和 (表示查询的数量)。
每个测试用例的第二行包含一个长度为 的字符串 ,每个字符为 (
或 )
,表示一个 Lisp++ 程序(平衡括号字符串),如上所述。
每个测试用例的第三、第四和第五行各包含 个整数。这些行的第 个整数分别为上述的 、 和 。
每个测试用例的第六和第七行各包含 个整数。这些行的第 个整数分别为上述的 和 。
输出格式
对于每个测试用例,输出一行 Case #x: y
,其中 是测试用例编号(从 1 开始), 是上述所有 值的总和。
输入输出样例 #1
输入 #1
1
12 5
(()(((()))))
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1
7 4 4 12 5
12 11 10 1 6
输出 #1
Case #1: 10
说明/提示
样例解释
在样例中(符合测试集 1 的限制),所有移动的时间成本相同(每次移动 1 秒)。各查询的最短时间如下:
- 从 向右移动五次到 ,耗时 秒。
- 从 传送到 ,耗时 秒。
- 从 传送到 ,再向左移动到 ,耗时 秒。
- 从 传送到 ,耗时 秒。
- 从 向右移动到 ,耗时 秒。
因此,查询时间的总和为 秒。
数据范围
- 。
- 对于最多 9 个测试用例, 且 。
- 其他所有情况下, 且 。
- 字符串 的长度为 ,且 是一个平衡括号字符串,如上所述。
- 对于所有 ,。
- 对于所有 ,。
测试集 1(12 分,可见判定)
- 对于所有 ,。
- 对于所有 ,。
- 对于所有 ,。
测试集 2(23 分,隐藏判定)
- 对于所有 ,。
- 对于所有 ,。
- 对于所有 ,。