【补题】Codeforces Round 735 (Div. 2) B. Cobb
题意:
思路:Codeforces Round #735 (Div. 2)-B. Cobb-题解
1.你多想了会之后,你会发现题目给出的这个公式,转化是不可能的,这个或其实也没什么逻辑可循,就是得算,于是乎得从其他地方入手
2.发现题目数据a[i]<=n,k<100,这个提示还是比较明显的,但是我还以为是故意误导人的,然后由于a[i]<=n,或操作在怎么搞,也就是把出现过的最高位开始往低位全部变成1,就这,都没办法超过2*n,那很明显了,i*j可以为n*n啊,所以说即使a[i]a[j]极限情况全是2*n,最坏也就少100(k)*2*n,所以当i,j==(n-200)的时候,就算n*n有着最坏的削减,n*(n-200)没有削减,那也不能比n*n大,因此本题最多枚举200*200,好了迎刃而解,暴力就完事了
只能说输在了以为k的数据是误导人的,自己想到贪心计算a[i]/i上面了
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS \std::ios::sync_with_stdio(0); \std::cin.tie(0); \std::cout.tie(0)const int N = 3e5 + 5;
const int INF = 1e18;
// const int MOD = 998244353;
// const int MOD=1e9+7;
// const int MOD=100003;
const int maxn=5e5+10;void solve(){int n,m;std::cin >> n >> m;std::vector<int> ve(n+1);for(int i=1;i<=n;i++){std::cin >> ve[i];}int ans=-INF;for(int i=n;i>=std::max(1ll,n-200);i--){for(int j=n;j>=std::max(1ll,n-200);j--){if(i==j) continue;int now=i*j-m*(ve[i]|ve[j]);ans=std::max(now,ans);}}std::cout << ans << '\n';
} signed main(){IOS;int t=1;std::cin >> t;while(t--){solve();}
}