CF1716E Swap and Maximum Block
题目描述
给定一个长度为 $2^n$ 的数组。数组中的元素从 $1$ 到 $2^n$ 编号。
你需要对该数组处理 $q$ 次查询。在第 $i$ 次查询中,你会得到一个整数 $k$($0 \le k \le n-1$)。处理该查询时,你需要执行以下操作:
- 对于每个 $i \in [1, 2^n-2^k]$(按升序),执行如下操作:如果第 $i$ 个元素在本次查询中已经和其他元素交换过,则跳过;否则,将 $a_i$ 与 $a_{i+2^k}$ 交换;
- 完成上述操作后,输出数组所有连续子段(包括空子段)中的最大和。
例如,若数组 $a$ 为 $[-3, 5, -3, 2, 8, -20, 6, -1]$,且 $k=1$,则本次查询的处理过程如下:
- 第 $1$ 个元素尚未交换过,与第 $3$ 个元素交换;
- 第 $2$ 个元素尚未交换过,与第 $4$ 个元素交换;
- 第 $3$ 个元素已交换过,跳过;
- 第 $4$ 个元素已交换过,跳过;
- 第 $5$ 个元素尚未交换过,与第 $7$ 个元素交换;
- 第 $6$ 个元素尚未交换过,与第 $8$ 个元素交换。
因此,数组变为 $[-3, 2, -3, 5, 6, -1, 8, -20]$。最大连续子段和为 $[5, 6, -1, 8]$,答案为 $18$。
注意,查询会实际改变数组,即每次查询后数组不会恢复到原始状态,下一次查询将在修改后的数组上进行。
输入格式
第一行包含一个整数 $n$($1 \le n \le 18$)。
第二行包含 $2^n$ 个整数 $a_1, a_2, \dots, a_{2^n}$($-10^9 \le a_i \le 10^9$)。
第三行包含一个整数 $q$($1 \le q \le 2 \cdot 10^5$)。
接下来 $q$ 行,每行一个整数 $k$($0 \le k \le n-1$),表示第 $i$ 次查询。
输出格式
对于每次查询,输出一个整数,表示处理完该查询后数组所有连续子段(包括空子段)的最大和。
说明/提示
示例中的数组变化过程为:$[-3, 5, -3, 2, 8, -20, 6, -1] \rightarrow [-3, 2, -3, 5, 6, -1, 8, -20] \rightarrow [2, -3, 5, -3, -1, 6, -20, 8] \rightarrow [5, -3, 2, -3, -20, 8, -1, 6]$。
由 ChatGPT 4.1 翻译