Codeforces Round 738 (Div. 2) A. Mocha and Math

发布时间 2023-09-26 22:14:48作者: zsxuan

给一个数组 \(a_1, a_2, \cdots, a_n\) 。可以执行以下操作任意次:

  • 选择 \(l, r (1 \leq l < r \leq n)\) ,对于任意 \(l \leq i \leq r\) ,同时执行所有 \(a_{l + i} = a_{l + i} \& a_{r - i}\)

希望经过若干次操作后, \(a\) 的最小的最大值。

性质:\(x \& y \leq min(x, y)\)

\(b\)\(a\) 经过操作后的数组。
观察到:取 \([1, 2], [1, 3], \cdots, [1, n]\) 可以使 \(b_1 = \&_{i=1}^{n} a_i\) 。再取 \([1, 2], [1, 3], \cdots, [1, n]\) 可以使 \(b_i = b_1\)

于是经过操作后,可以使所有值为 \(\&_{i=1}^{n} a_i\)

view
#include <bits/stdc++.h>
#define REP(i, A, N) for (int i = (int)A; i <= (int)N; i++)
#define PER(i, N, A) for (int i = (int)N; i >= (int)A; --i)
typedef long long ll;
void solve() {
	int n; std::cin >> n;
	std::vector<int> a(n+1);
	REP(i,1,n) std::cin >> a[i];
	int x = a[1]; REP(i,1,n) x &= a[i];
	std::cout << x << '\n';
}
int main() {
	int _ = 1; std::cin >> _;
	while ( _-- ) { solve(); }
	return 0;
}