#P11981. [KTSC 2021] 猴子 / monkey

[KTSC 2021] 猴子 / monkey

题目背景

本题翻译自 2021년도 국제정보올림피아드 대표학생 선발고사 2차 선발고사 #3 원숭이

提交时,请在程序开头添加如下内容,并且无需引用 monkey.h

#include <vector>
#include <utility>

long long max_bananas(std::vector<int> A, std::vector<int> B,
            std::vector<std::pair<int, int> > P);

题目描述

有两根并排的柱子 A 和 B。每根柱子上有 NN 个把手,这些把手从下到上依次编号为 11NN。每根柱子上挂有 00 个或更多香蕉。AiA_i 表示柱子 A 的第 ii 个把手上挂的香蕉数量,BjB_j 表示柱子 B 的第 jj 个把手上挂的香蕉数量。这些值是 0010910^9 之间的整数。

猴子可以用双手抓住两根柱子上的不同把手。注意,不能抓住同一根柱子上的两个把手。此外,猴子不能随意抓住任何把手。猴子可以抓住的两个把手的组合可以用 (x,y)(x, y) 表示,这意味着可以同时抓住柱子 A 的第 xx 个把手和柱子 B 的第 yy 个把手。此时,猴子可以吃掉这两个把手上剩下的所有香蕉。显然,一旦吃掉香蕉,香蕉就会消失。这样的有序对共有 MM 个。

最初,猴子从可以抓住的两个把手的组合中的一个位置出发。当猴子当前位于 (x,y)(x, y) 时,可以移动到另一个可以抓住的两个把手的组合 (x,y)(x', y'),条件是满足 x<xx < x'y=yy = y',或者 x=xx = x'y<yy < y'

猴子当然希望尽可能多吃香蕉。给定可以抓住的把手的信息以及这些把手上挂的香蕉数量,编写一个程序计算猴子最多可以吃多少香蕉。

实现细节

你需要实现以下函数。

long long int max_bananas(vector<int> A, vector<int> B, vector< pair<int, int> > P)
  • 此函数仅被调用一次。
  • A 的长度为 NNA[i] 表示柱子 A 的第 i+1i+1 个把手上挂的香蕉数量(0iN10 \leq i \leq N-1)。
  • B 的长度为 NNB[i] 表示柱子 B 的第 i+1i+1 个把手上挂的香蕉数量(0iN10 \leq i \leq N-1)。
  • P 的长度为 MM,如果 (x,y)(x, y) 包含在 P 中,则猴子可以同时抓住柱子 A 的第 xx 个把手和柱子 B 的第 yy 个把手,并吃掉这两个把手上剩余的香蕉。保证不会多次给出相同的有序对。
  • 此函数应根据输入信息返回猴子最多可以吃的香蕉数量。

在提交的源代码中,任何部分都不得执行输入输出函数。

输入格式

示例评测程序按以下格式接收输入:

  • 11 行: N MN \ M
  • 22 行: A[0] A[1]  A[N1]A[0] \ A[1] \ \cdots \ A[N - 1]
  • 33 行: B[0] B[1]  B[N1]B[0] \ B[1] \ \cdots \ B[N - 1]
  • 3+i3 + i 行(1iM1 \leq i \leq M): P[i - 1].first P[i - 1].second\texttt{P[i - 1].first P[i - 1].second}

输出格式

示例评测程序按以下格式输出:

  • 11 行: 函数 max_bananas 返回的值

注意,示例评测程序可能与实际评分器不同。

3 3
2 3 1
3 2 4
1 1
2 1
1 3
9

提示

约束条件

  • 1N5000001 \leq N \leq 500\,000
  • 1M5000001 \leq M \leq 500\,000
  • MN2M \leq N^2
  • 0Ai1090 \leq A_i \leq 10^91iN1 \leq i \leq N
  • 0Bi1090 \leq B_i \leq 10^91iN1 \leq i \leq N
  • 参数 P 给出的有序对 (x,y)(x, y) 互不相同,且满足 1xN1 \leq x \leq N1yN1 \leq y \leq N

子任务

  1. 1111 分)
    • M16M \leq 16
  2. 4242 分)
    • M5000M \leq 5\,000
  3. 9797 分)
    • 无额外约束条件。

评分标准

只有当 max_bananas 函数返回的香蕉数量与正确答案完全一致时,该测试用例才被视为正确。

注意,每个子任务的得分是该子任务所有测试用例得分的最小值。

示例

  • 考虑 N=3N = 3M=3M = 3A=[2,3,1]A = [2, 3, 1]B=[3,2,4]B = [3, 2, 4]P=[(1,1),(2,1),(1,3)]P = [(1, 1), (2, 1), (1, 3)] 的情况。

    评分器将调用以下函数:

    max_bananas([2, 3, 1], [3, 2, 4], [(1, 1), (2, 1), (1, 3)])
    

    (1,1)(1, 1) 出发,移动到 (1,3)(1, 3),总共可以吃掉 2+3+4=92 + 3 + 4 = 9 个香蕉,这是最多可能的香蕉数量。因此,max_bananas 函数应返回 99

    此示例满足所有子任务的约束。