CF1554B-Cobb
题目大意:给出一个长度为n的数列a[]和一个数字k,找出两个不同的数i,j,使得f(i,j)=i×j−k×(a[i]∣a[j])最大。
已知a[i]∣a[j]≤2×n,则k×(a[i]∣a[j])的最大值为2×k×n。若i×j与(n−1)×n的差值大于2×k×n,f(i,j)<f(n−1,n)恒成立。所以只需要找满足(n−1)×n−i×j≤2×k×n的i,j就可以了。由于题目数据范围较小,可以过。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| #include <bits/stdc++.h> using namespace std; long long a[100005]; int main() { int _; long long n, k; scanf("%d", &_); while (_--) { scanf("%lld%lld", &n, &k); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); long long i, j, t1 = n * (n - 1), t2 = 2 * k * n, res = -1e18; for (j = n; j && t1 - j * (j - 1) <= t2; j--) for (i = j - 1; i && t1 - j * i <= t2; i--) res = max(res, i * j - k * (a[i] | a[j])); printf("%lld\n", res); } return 0; }
|