CF1554B Cobb 题解

题意

题目链接

给定一个长度为 n 的数列 {an},试找到一个整数对 (i,j),使得 ijk(ai|aj) 最大,并输出最大值。(1i<jn

n105,0kmin(n,100),0ain

分析

暴力枚举是 O(n2) 的,显然无法通过。

我们注意到,根据数学或的性质,显然 0ai|aj2max(ai,aj)an,那我们能否枚举 ai|aj 呢?

虽然这也不可取,不过这为我们打开了另一个思路。不难发现,ijf(i,j)=ijk(ai|aj)ijkn,那么我们尝试给这个最大值设定一个下限,不妨为 f(n1,n)=n(n1)k(an1|an)n(n1)2kn=n(n2k1)

那么,我们重新尝试枚举,发现左端点 l 至少得大于 n2k1,否则所得到的函数值 f(l,j) 必然不会大于 f(n1,n)。这样,我们就成功的将枚举的复杂度从 O(n2) 压到了 O(k2),能够成功 AC。

核心知识点:数学或的性质,ai,k 的不寻常范围,数学分析

代码

#include<bits/stdc++.h> using namespace std; #define LL long long const int N = 100010; int n; LL k, a[N]; LL solve() { cin >> n >> k; for (int i = 1; i <= n; ++i) cin >> a[i]; LL res = -1e18; for (LL i = max(1LL, n - 2 * k); i < n; ++i) for (LL j = i + 1; j <= n; ++j) res = max(res, i * j - k * (a[i] | a[j])); return res; } int main() { int T; cin >> T; while (T--) cout << solve() << endl; return 0; }

__EOF__

本文作者cyhforlight
本文链接https://www.cnblogs.com/cyhforlight/p/15960123.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   cyhforlight  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示