P9032 [COCI2022-2023#1] Neboderi
可以发现,如果固定
接着可以发现,
可以这样理解:如果
所以固定
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <numeric>
#include <vector>
using namespace std;
const int N = 1e6 + 5;
int n, k, a[N];
long long ans = 0, sum[N];
int f[N][31], LG2[N];
void Init()
{
LG2[1] = 0;
for (int i = 2; i < N; i++) LG2[i] = LG2[i >> 1] + 1;
for (int i = 1; i <= n; i++)
{
f[i][0] = a[i];
}
for (int j = 1; j <= LG2[n]; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
f[i][j] = gcd(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int l, int r)
{
int x = LG2[r - l + 1];
return gcd(f[l][x], f[r - (1 << x) + 1][x]);
}
int main()
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++) scanf("%d", &a[i]), sum[i] = sum[i - 1] + a[i], ans = max(ans, 1LL * a[i]);
Init();
for (int i = 1; i <= n - k + 1; i++)
{
int nowres = a[i], p = i;
while (p <= n)
{
int l = p + 1, r = n, rr = 0;
while (l <= r)
{
int mid = l + r >> 1;
int gc = query(i, mid);
if (gc >= nowres)
{
l = mid + 1;
}
else
{
r = mid - 1;
rr = mid;
}
}
if (rr == 0) break;
nowres = query(i, rr);
p = rr - 1;
if (p - i + 1 >= k)
{
ans = max(ans, (sum[p] - sum[i - 1]) * (long long)(query(i, rr - 1)));
//printf("%d %d\n", i, p);
}
p = rr;
}
ans = max(ans, (sum[n] - sum[i - 1]) * query(i, n));
}
printf("%lld\n", ans);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现