P9032
题意:有一个长为
sol:首先考虑区间
从小到大枚举左端点,用
正难则反,我们改成从大到小枚举左端点,假设枚举到
由于先前的分析,链表中的元素始终不会超过
#include<bits/stdc++.h>
using namespace std;
#define QwQ330AwA return 0
#define ll long long
#define pii pair <int, int>
const int N = 1e6 + 5;
int n, k;
int nxt[N], val[N];
ll s[N], ans;
int gcd(int x, int y) {
if (!y) return x;
return gcd(y, x % y);
}
void solve(){
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> val[i];
s[i] = s[i - 1] + val[i];
nxt[i] = i + 1;
}
nxt[n + 1] = n + 1;
for (int l = n; l >= 1; l--) {
int now = l;
for(; now != n + 1;){
val[now] = gcd(val[l], val[now]);
if(nxt[now] - l >= k) {
ans = max(ans, val[now] * (s[nxt[now] - 1] - s[l - 1]));
}
now = nxt[now];
}
now = l;
for (; now != n + 1;) {
while(val[now] == val[nxt[now]]) {
nxt[now] = nxt[nxt[now]];
}
now = nxt[now];
}
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
solve();
QwQ330AwA;
}
为什么突然写这篇题解呢,熟悉我的人知道我是基本不写 luogu 题解的。所以说是为什么呢?是为什么呢?
2023.11.8