AtCoder-ABC-267 C - Index × A(Continuous ver

C - Index × A(Continuous ver.)

题目大意:

给定n个数(a1,a2...an),从中选连续m个数,这m个数的和为:i=1mibi
求最大的和为多少。

1<=m<=n<=2105
2105<=ai<=2105

解题思路

首先 m 个数为一组,那么最多有 n - m + 1 组,这个数量是可以被遍历的,但是每一组的值需要在 O(1) 的时间内算出来。

举例:

7 3 1 2 3 4 5 6 7

其中前一组为 21  32  43的和,后一组为31  42  53的和

前一组-后一组:21  31  41  53

可以看出,结果可以表示为:(上一组的所有数的一倍之和) - (当前组最后一个数的 m 倍),连续的几个数之和显然可以用前缀和解决,单独的一个数的倍数,不用解决,直接算。

上面的的结果是:前一组 - 后一组( a - b = sum - m*x),那么对于后一组 b = a + mx - sum,

实现过程:预先算出第一组,从第二组开始,每一组采用上面的式子,算出当前组的值,并维护最大值。

在计算过程中,注意使用前缀和的下标即可

for (int i = 2; i <= n - m + 1; ++i) { ans[i] = ans[i - 1] + m * a[m + i - 1] - (s[m + i - 2] - s[i - 2]); //当前组的最后一个值为,当前组的第一个数,也就是i,+m-1即可,i+m-1 //上一组的最后一个数,为当前组倒数第二个数,即i+m-1再-1 -> i+m-2 //上一组的第一个数为当前组的第一个数的前一个,即i-1,但是前缀和需要减再前面一个的前缀,即i-2 maxx = max(maxx, ans[i]); //cout << "ans: " << ans[i] << endl; }

AC

#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double db; #define IOS ios::sync_with_stdio(false),cin.tie(0); const int inf = 0x3f3f3f3f; const int mod = 1e9 + 7; const int MOD = 998244353; const int N = 1e5 + 5; //kmp kruskal lca 线段树 线性筛 组合数 线性同余方程 逆元 int n, m; void solve () { cin >> n >> m; vector<ll>a(n + 1); vector<ll>s(n + 1); vector<ll>ans(n + 1); a[0] = s[0] = 0; for (int i = 1; i <= n; ++i) { cin >> a[i]; s[i] = s[i - 1] + a[i]; } for (int i = 1; i <= m; ++i) { ans[1] += i * a[i]; } ll maxx = ans[1]; //cout << "ans: " << ans[1] << endl; for (int i = 2; i <= n - m + 1; ++i) { ans[i] = ans[i - 1] + m * a[m + i - 1] - (s[m + i - 2] - s[i - 2]); maxx = max(maxx, ans[i]); //cout << "ans: " << ans[i] << endl; } cout << maxx << endl; } signed main() { IOS int T; T = 1; //cin >> T; while (T--)solve(); return 0; }

__EOF__

本文作者WAinAll
本文链接https://www.cnblogs.com/WAinAll/p/17635880.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   WAinAll  阅读(38)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示