#P9371. [APIO2023] 序列 / sequence

    ID: 8563 Type: RemoteJudge 1500ms 2048MiB Tried: 0 Accepted: 0 Difficulty: 6 Uploaded By: Tags>2023APIO交互题Special JudgeO2优化

[APIO2023] 序列 / sequence

题目背景

由于部分 BUG,使用 C++14 (GCC9) 提交会产生编译错误,请使用 C++14 等语言进行提交。

提交时,无需引用 sequence.h。你提交的代码中需要实现以下函数:

int sequence(int N, std::vector<int> A)

题目描述

在迷人的 APIO 国,居住一位着年轻智慧的学生 Alice。Alice 对解决能挑战她数学能力的有趣问题有着永不满足的好奇心。一天,她在解决一个神秘的有关长为 NN 的序列 (即 A[0],A[1],,A[N1]A[0], A[1], \cdots, A[N-1] ) 的问题时遇到了困难,她无法抗拒探索答案的诱惑力。

现在,她想要与你分享一些她的发现。不过,为了更好的理解,我们需要给出以下定义:

  • 定义 W(l,r,x)W(l, r, x)i=lrI[A[i]=x]\sum_{i=l}^{r} \mathbb{I}[A[i]=x], 即 xxA[l]A[r]A[l] \cdots A[r] 中的出现次数。
  • 定义一个非空整数序列 B[0]B[1]B[k1]B[0] B[1] \cdots B[k-1] 的中位数集合为 S({B[0],B[1]B[k1]})S(\{B[0], B[1] \cdots B[k-1]\}), 然后 Alice 会展示如何分步计算中位数集合:

○首先,将序列 B[0],B[1],,B[k1]B[0], B[1], \ldots, B[k-1] 按照升序排序,令排好序的序列为 C[0],C[1],,C[k1]0C[0], C[1], \ldots, C[k-1]_{0}

○ 然后, $S(\{B[0], B[1] \cdots B[k-1]\})=\left\{C\left[\left\lfloor\frac{k-1}{2}\right]\right], C\left[\left\lceil\frac{k-1}{2}\right\rceil\right]\right\}$ 。

○ 为了能更好的理解 SS 的计算,以下为一些例子:

  • S({6,3,5,4,6,2,3})={4}S(\{6,3,5,4,6,2,3\})=\{4\}.
  • S({4,2,3,1})={2,3}S(\{4,2,3,1\})=\{2,3\}
  • S({5,4,2,4})={4}S(\{5,4,2,4\})=\{4\}.

作为一道具有挑战性的问题, Alice 想对于所有的 (l,r)(0lrN1)(l, r)(0 \leq l \leq r \leq N-1) 找到其价值 maxxS(l,r)W(l,r,x)\max _{x \in S(l, r)} W(l, r, x) 的最大值。其中 S(l,r)S(l, r) 代表 A[l]A[r]A[l] \cdots A[r] 导出的中位数集合(正如之前提到的 S(A[l],,A[r])S(A[l], \cdots, A[r]) )。虽然 Alice 已经得到了答案,她需要核对答案的正确性,所以她找到了你,希望你能编程解决问题。

实现细节

你需要实现如下的过程:

int sequence(int N, std:: vector<int> A);
  • NN :序列 AA 的长度。
  • AA : 一个长度为 NN 的数组,即输入中提到的序列 AA
  • 该函数应返回一个整数,代表所有可行 (l,r)(l, r) 价值的最大值。
  • 这个函数恰好被调用一次。

输入格式

评测程序示例读取如下格式的输入:

11 行: NN

22 行: A[0]A[1]A[N1]A[0] A[1] \cdots A[N-1]

输出格式

评测程序示例按照如下的格式打印你的答案:

11 行:sequence 的返回值。

7
1 2 3 1 2 1 3
3
9
1 1 2 3 4 3 2 1 1
2
14
2 6 2 5 3 4 2 1 4 3 5 6 3 2
3

提示

例子

样例 1

考虑如下的调用:

sequence(7,{1,2,3,1,2,1,3});

函数应返回 33

在这个样例中, S(0,5)={1,2},W(0,5,1)=3W(0,5,2)=2S(0,5)=\{1,2\}, W(0,5,1)=3 , W(0,5,2)=2 ,所以 (0,5)(0,5) 的价值为 3 。

容易验证 (0,5)(0,5) 在所有合法的 (l,r)(l, r) 二元组中有着最大的价值。

样例 2

考虑如下的调用:

sequence(9,{1,1,2,3,4,3,2,1,1});

函数应返回 22

样例 3

考虑如下的调用:

sequence(14,{2,6,2,5,3,4,2,1,4,3,5,6,3,2});

函数应返回 33

约束条件

  • 1N5×1051 \leq N \leq 5 \times 10^{5}
  • 1A[i]N1 \leq A[i] \leq N

子任务

  1. (11 分):N100N \leq 100
  2. (17 分):N2×103N \le 2 \times 10^{3}
  3. (7 分):存在一个 xx 满足 0i<x,A[i]A[i+1]\forall 0 \leq i<x, A[i] \leq A[i+1]x<i<N,A[i]A[i1]\forall x<i<N, A[i] \leq A[i-1]
  4. (12 分):A[i]3A[i] \leq 3
  5. (13 分):W(0,N1,A[i])2W(0, N-1, A[i]) \leq 2 (对于所有满足 0iN10 \leq i \leq N-1ii )。
  6. (22 分):N8×104N \leq 8 \times 10^{4}
  7. (18 分):没有额外限制。