CF1554B Cobb

原题传送门

题目大意:给定长度为 n n n的非负整数序列 a 1 , a 2 , . . . . , a n − 1 , a n a_1,a_2,....,a_{n-1},a_n a1,a2,....,an1,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)) max1i<jn(i×jk×(aiaj))

思路:首先,我们知道一个数按位或上另一个数,结果不会小于这两个数,因此放缩一下可以得到: 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×jk×(aiaj)j×(j1)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 ansj×(j1)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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不会数据库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值