Codeforces Round 819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022 A. Mainak and Array

发布时间 2023-09-10 18:35:31作者: zsxuan

给一个长为 \(n\) 的正整数数组,执行以下操作严格一次。

  • 选择 \(l, r, (1 \leq l < r \leq n)\) ,任意一个正整数 \(k\)
  • 重复 \(k\) 次:让 \([l, r]\) 的数组成环,按顺时针走一次。

希望 \(a_n - a_1\) 最大,找到这个数。

分类讨论题。

  • 先判断 \(n\)\(1\)\(a_n - a_1\) 恒为 \(0\) ,因为以下操作至少需要两个数(迭代器可能越界)
  • 选择的环不包括 \(a_1\) \(a_n\) ,则 \(a_n - a_1\) 恒不变
  • 选择的环包括 \(a_1\) \(a_n\) ,则 \((a_n - a_1)_{max} = (a_{i + n - 1} - a_i)_{max}\) 。可以破环为链 \(O(n)\) 计算。
  • 选择的环包括 \(a_1\) 不包括 \(a_n\) ,则 \((a_n - a_1)_{max} = max_{i=2}^{n} a_i - a_1\)
  • 选择的环包括 \(a_n\) 不包括 \(a_1\) ,则 \((a_n - a_1)_{max} = a_n - min_{i=1}^{n-1} a_i\)
view
#include <bits/stdc++.h>
void solve() {
	int n; std::cin >> n;
	std::vector<int> a(n+1);
	for (int i = 1; i <= n; i++) std::cin >> a[i];
	int Max = a[n] - a[1];
	if (n > 1) {
		Max = std::max(Max, a[n] - *std::min_element(a.begin() + 1, a.begin() + n));
		Max = std::max(Max, *std::max_element(a.begin() + 2, a.end()) - a[1]);
		for (int i = 1; i <= n; i++) a.push_back(a[i]);
		for (int i = 1; i <= n; i++) Max = std::max(Max, a[i + n - 1] - a[i]);
	}
	std::cout << Max << '\n';
}
signed main() {
	int _ = 1; std::cin >> _;
	while (_--) solve();
	return 0;
}