Wraith_Fiee的博客

CF1554B Cobb

2021-11-18 · 2 min read
构造 位运算 Codeforces

原题传送门

题目大意:给定长度为nn的非负整数序列a1,a2,....,an1,ana_1,a_2,....,a_{n-1},a_n和一个正整数kk
max1i<jn(i×jk×(aiaj))max_{1\le i\lt j\le n}(i\times j-k\times (a_i |a_j))

思路:首先,我们知道一个数按位或上另一个数,结果不会小于这两个数,因此放缩一下可以得到:i×jk×(aiaj)j×(j1)k×aji\times j-k\times (a_i |a_j)\le j\times (j-1)-k\times a_j
那对于当前答案ansans,如果ansj×(j1)k×ajans\le j\times (j-1)-k\times a_j,那我们就没必要向前扫描ii去求最大值了,直接jj++即可

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;
}
在吹不出褶皱的日子里发光
Powered by Gridea