P7959 [COCI 2014/2015 #6] WTF

题目描述

你有一个长度为 $n$ 的数组 $\textbf A$,一个值域为 $[1,n-1]$ 的长度为 $n+1$ 的数组 $\textbf{ID}$ 和一个整数 $r$。 我们通过以下伪代码对数组 $\textbf A$ 进行 Warshall-Turing-Fourier 变换 $^\textsf{[1]}$: ```cpp sum = 0 for i = 1 to n index = min{ID[i], ID[i+1]} sum = sum + A[index] Rorate(A, r) Change(A) for i = 1 to n index = max{ID[i], ID[i+1]} index = index + 1 sum = sum + A[index] Rorate(A, r) ``` 其中: - $\texttt{Change}(\textbf A)$ 表示把数组 $\textbf A$ 中所有元素分别改成它们的相反数。 - $\texttt{Rorate}(\textbf A,r)$ 表示把数组 $\textbf A$ 复制两遍得到数组 $\textbf B$,取 $\textbf B[n-r+1,2n-r]$ 代替数组 $\textbf A$。\ 即**向右旋转** $R$ 个位置。 你已经知道数组 $\textbf A$ 和整数 $r$,但你并不知道数组 $\textbf{ID}$。 你需要求出 WTF 变换后伪代码中 $\text{sum}$ 可能的最大值。 $\textsf{[1]}$:实际上并不存在,当然也可以叫做「Sept 变换」。

输入格式

第一行两个整数 $n,r$。 接下来一行 $n$ 个整数,表示数组 $\textbf A$。

输出格式

第一行一个整数,即伪代码中 $\text{sum}$ 可能的最大值。 第二行 $n+1$ 个整数,即使得 $\text{sum}$ 值最大的 $\textbf{ID}$ 数组。 **如果存在多组解,输出任意一种。**

说明/提示

#### 判分方式 如果输出只有第一行正确,可以得到 $50\%$ 的分数。 **但你必须保证第二行有 $\bm{n+1}$ 个符合要求的数。** #### 数据规模与约定 **本题采用 Special Judge。** - 对于 $20\%$ 的数据,有 $n\le 7$。 - 对于 $60\%$ 的数据,有 $n\le 300$。 - 对于 $100\%$ 的数据,有 $2\le n\le 3\times 10^3$,$1\le r\le n$,$\textbf A[i]\in[-10^4,10^4]$。 你需要保证你构造的 $\textbf{ID}[i]\in[1,n-1]$。 #### 说明 按原题配置,满分 160 分。 译自 **[COCI 2014-2015](https://hsin.hr/coci/archive/2014_2015/)** [Contest #6](https://hsin.hr/coci/archive/2014_2015/contest6_tasks.pdf) Task F _**WTF**_。