给一个数组 \(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;
}