题意:
给你长度为n的数组a,和k。求
m
a
x
(
i
∗
j
−
k
∗
(
a
[
i
]
∣
a
[
j
]
)
max(i*j-k*(a[i]|a[j])
max(i∗j−k∗(a[i]∣a[j])
题解:
有点思维固话的感觉了,看到或就想从这个地方下手。但是注意到它k<=100,也就是说i和j之间的距离不会超过
k
∗
(
a
[
i
]
∣
a
[
j
]
)
j
\frac{k*(a[i]|a[j])}{j}
jk∗(a[i]∣a[j]),因为如果超过的话,i*j减少的量就超过后面的不部分了,也就是一定是更劣的情况。然后我们发现只需要枚举每个位置,然后再枚举可行的点位。
这样时间复杂度是调和级数nlogn
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+5;
ll a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
ll ans=-1e18;
for(ll i=n;i;i--)
for(ll j=i-1;j&&j>=i-n*k/i;j--)
ans=max(ans,i*j-(a[i]|a[j])*k);
printf("%lld\n",ans);
}
return 0;
}