阿塞拜疆是一个地下资源丰富的国家,石油的生产使得国民可以以非常低廉的价格使用汽油。阿塞拜疆的首都巴库有 $N$ 个交叉路口和 $N-1$ 条双向道路。巴库是一座南北狭长的城市,交叉路口呈南北向直线排列,从最北端的交叉路口开始,依次编号为 $1$ 到 $N$。道路分为旧路和新路。$N-1$ 条旧路连接了每一对相邻的交叉路口 $i$ 和 $i+1$(其中 $1 \le i < N$)。$M$ 条新路分别连接两个没有被旧路直接连接的交叉路口。连接同一对交叉路口的道路最多只有 $1$ 条。
由于首都巴库近期的财政状况不佳,政府决定在部分道路上设置收费站以收取通行费。由于在过多的道路上收费可能会引起市民的不满,因此政府决定恰好在 $2$ 条道路上设置收费站。每当一辆车经过一个收费站时,就会收取 $1$ 马纳特(阿塞拜疆货币单位)的通行费。如果一辆车经过了两个收费站,则需要支付两次通行费。
每个交叉路口都有 $N-1$ 辆车。每个交叉路口的所有车辆都将前往除当前所在位置以外的其他交叉路口。当从交叉路口 $u$ 前往交叉路口 $v$ 时,驾驶员会选择支付最少通行费的路径。(该国汽油价格低廉。)
请编写一个程序,计算出当所有车辆都到达目的地后,能够获得的最大通行费总额。
你需要实现以下函数:
long long findEdges(int N, int A[], int B[]):该函数仅在程序开始时调用一次。它提供了交叉路口和道路的结构。$N$ 是交叉路口的数量。$A$ 和 $B$ 是大小为 $M$ 的数组(vector)。这意味着交叉路口 $A[i]$ 和交叉路口 $B[i]$ 之间有一条新路。注意,$i$ 的范围是 $0$ 到 $M-1$。你需要返回在给定的交叉路口和道路情况下,通过在两条道路上设置收费站所能获得的最大通行费总额。
实现细节
你需要提交一个名为 oil.cpp 的文件。该文件必须实现上述函数。
long long findEdges(int N, int A[], int B[])
该函数必须按照上述说明运行。当然,你可以在内部创建并使用其他函数。提交的代码不得执行输入输出操作,也不得访问其他文件。
子任务
- 子任务 1 [10 分]:$3 \le N \le 100$,$0 \le M \le 100$
- 子任务 2 [13 分]:$3 \le N \le 2,000$,$0 \le M \le 2,000$
- 子任务 3 [48 分]:$3 \le N \le 100,000$,$0 \le M \le 100,000$
- 子任务 4 [29 分]:$3 \le N \le 500,000$,$0 \le M \le 500,000$
样例
样例 1
4 3 3 1 2 4 1 4
| 调用 | 结果 |
|---|---|
findEdges(4, {3, 2, 1}, {1, 4, 4}) |
返回值 0 |
样例 2
4 1 1 3
| 调用 | 结果 |
|---|---|
findEdges(4, {1}, {3}) |
返回值 8 |
样例 3
4 0
| 调用 | 结果 |
|---|---|
findEdges(4, {}, {}) |
返回值 14 |