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; }
   |