P17120 [Algo Beat 009 & MROI-R1] Parallel Parentheses

题目描述

:::warning[必读信息]{open} - 本题仅支持 C++ 语言。 - 请勿使用 C++14 (GCC 9) 提交。 - 比赛期间,禁止利用评测库漏洞、hack 评测库等方式获得不应得的分数,否则将被取消此题成绩。 ::: **这是一道分布式计算题**。 小 R 给了你一个长度为 $M$ 的由 `(` 和 `)` 组成的字符串 $S$。记 $S_{i,j}$ 表示 $S$ 第 $i$ 个字符到第 $j$ 个字符的子串,即 $S_iS_{i+1}\dots S_{j}$。 你需要求出最大的 $r-l+1$,满足 $S_{l,r}$ 是一个合法括号串。 :::info[什么是合法括号串?] - 空串合法; - 若 $A$ 合法,则 $(A)$ 合法; - 若 $A, B$ 合法,则 $AB$ 合法。 ::: ### 【分布式环境定义】 - 系统中共有 $N$ 个节点,编号为 $0, 1, \dots, N-1$。 - 字符串 $S$ 被均分为 $N$ 块(保证 $M$ 是 $N$ 的倍数),每块长度 $L = {M \over N}$。 - 节点 $id$ 负责维护第 $id$ 块,即子串 $S_{id \times L, (id+1) \times L - 1}$。 - 节点之间可以通过完全图网络互相发送消息,即一个节点可以向任意一个其他节点发送消息。 ### 【支持函数列表】 - `GetN()`:返回节点总数 $N$。 - `GetMyId()`:返回当前运行节点的编号 $id$。 - `GetM()`:返回字符串总长度 $M$。 - `GetCharAt(long long i)`:返回 $S_i$。 **注意**:请求的下标 $i$ 必须在当前节点的负责范围内。 - `PutInt(int target, int val)` / `PutLL(int target, long long val)`:将数据 `val` 放入发往 `target` 的缓冲区,分别占 $4, 8$ 字节。 - `Send(int target)`:将缓冲区的内容发送给 `target`。 **注意**:如果消息为空,可能出现无法预料的错误。 - `Receive(int source)`:阻塞等待并接收来自 `source` 的消息。 - `GetInt(int source)` / `GetLL(int source)`:从收到的消息中读取数据。 **注意**:`GetInt` 只会读取当前缓冲区前 $4$ 字节,`GetLL` 只会读取当前缓冲区前 $8$ 字节(读取后从缓冲区中移除)。如果当前缓冲区大小不足,可能出现无法预料的错误。样例评分器并没有判断这一点。 请在代码最前面声明这些函数: ```cpp int GetN(); int GetMyId(); long long GetM(); char GetCharAt(long long i); void PutInt(int target, int val); void PutLL(int target, long long val); void Send(int target); void Receive(int source); int GetInt(int source); long long GetLL(int source); ``` ### 【实现方式】 你需要实现一个函数 `long long LongestValidParentheses()`。**当且仅当 $\bm {id}$ 为 $\bm 0$ 时,你的返回值会被认为是你得到的答案**。当 $id \neq 0$ 时,你可以返回任意值,但注意不能不返回(这是未定义行为)。 ### 【特殊限制】 - 时间、空间限制:评分器与你实现的函数共用 $5$ 秒,$512 \text{ MB}$。保证**可供你使用的时间**不少于 $4$ 秒,空间不少于 $256 \text{ MB}$。 **注意**:你使用的时间、空间均分别为 $N$ 个节点所使用的时间、空间之和。 - 通信限制:每个节点在整个运行生命周期内,发送和接收的消息总大小不能超过 **$\bm{37\,500\,000}$ 字节**。 **特别说明**:同一个静态数组在不同进程中是独立的,并可以在每个进程内部复用,不会造成数据污染。 ### 【评分方式】 记**所有节点**通信量(Send 与 Receive 字节之和)**之和**为 $C$。 **注意**:若发送信息类型为 `int`,则占用 $4$ 字节;否则(类型为 `long long`)占用 $8$ 字节。 $$ \text{Score}(C)= \begin{cases} 100 & C\le 424\\ \max\left\{1,\left\lfloor 1+99\cdot \frac{\frac{1}{1+25t}-\frac{1}{26}} {1-\frac{1}{26}} \right\rfloor\right\} & 424

输入格式

你的程序不应从标准输入读取任何内容。注意样例输入是示例评分器输入。 ### 【示例评分器输入格式】 - 第一行两个整数 $N,M$。 - 第二行一个仅包含 `(` 和 `)` 的字符串 $S$,长度为 $M$。

输出格式

你的程序不应向标准输出写入任何内容。

说明/提示

### 【数据范围】 - $1 \le N \le 16$; - $1 \le M \le 1.6 \times 10^7$; - $1 \le L \le 1\,066\,666$; - $M \bmod N = 0$。 除样例外,本题仅一个 Subtask,评测时最终得分为取该 Subtask 得分最小值。 ::cute-table{tuack} |子任务编号|特殊性质|依赖子任务|分值| |:-:|:-:|:-:|:-:| |$0$|是样例|无|$0$| |$1$|无|$0$|$100$|