ζ

CF1554B-Cobb

    题解

题目大意:给出一个长度为nn的数列a[]a[]和一个数字k,找出两个不同的数i,ji,j,使得f(i,j)=i×jk×(a[i]a[j])f(i,j)=i \times j - k \times (a[i]|a[j])最大。

已知a[i]a[j]2×na[i]|a[j]\leq 2 \times n,则k×(a[i]a[j])k \times (a[i]|a[j])的最大值为2×k×n2\times k \times n。若i×ji \times j(n1)×n(n-1) \times n的差值大于2×k×n2 \times k \times nf(i,j)<f(n1,n)f(i,j) < f(n-1,n)恒成立。所以只需要找满足(n1)×ni×j2×k×n(n-1)\times n - i \times j \leq 2\times k \times ni,ji,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;
}
页阅读量:  ・  站访问量:  ・  站访客数: