题目大意:给定长度为
n
n
n的非负整数序列
a
1
,
a
2
,
.
.
.
.
,
a
n
−
1
,
a
n
a_1,a_2,....,a_{n-1},a_n
a1,a2,....,an−1,an和一个正整数
k
k
k
求
m
a
x
1
≤
i
<
j
≤
n
(
i
×
j
−
k
×
(
a
i
∣
a
j
)
)
max_{1\le i\lt j\le n}(i\times j-k\times (a_i |a_j))
max1≤i<j≤n(i×j−k×(ai∣aj))
思路:首先,我们知道一个数按位或上另一个数,结果不会小于这两个数,因此放缩一下可以得到:
i
×
j
−
k
×
(
a
i
∣
a
j
)
≤
j
×
(
j
−
1
)
−
k
×
a
j
i\times j-k\times (a_i |a_j)\le j\times (j-1)-k\times a_j
i×j−k×(ai∣aj)≤j×(j−1)−k×aj
那对于当前答案
a
n
s
ans
ans,如果
a
n
s
≤
j
×
(
j
−
1
)
−
k
×
a
j
ans\le j\times (j-1)-k\times a_j
ans≤j×(j−1)−k×aj,那我们就没必要向前扫描
i
i
i去求最大值了,直接
j
j
j++即可
Code:
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long ll;
ll t,a[N],n,k;
int main(){
cin>>t;
while(t--){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i];
ll ans=-1e18;
for(int j=n;j>1;j--){
if(ans<1LL*j*(j-1)-k*a[j]){
for(int i=j-1;i>=1;i--){
ans=max(ans,1LL*i*j-k*(a[i]|a[j]));
}
}
}
cout<<ans<<endl;
}
return 0;
}