首页 > 其他分享 >AtCoder-ABC-267 C - Index × A(Continuous ver

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

时间:2023-08-16 18:24:46浏览次数:49  
标签:AtCoder ABC ver 前缀 一组 Index int const

C - Index × A(Continuous ver.)

题目大意:

给定n个数(\(a_1,a_2...a_n\)),从中选连续m个数,这m个数的和为:\(\sum_{i=1}^mi*b_i\)
求最大的和为多少。

\(1<=m<=n<=2*10^5\)
\(-2*10^5<=a_i<=2*10^5\)

解题思路

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

举例:

7 3
1 2 3 4 5 6 7

其中前一组为 \(2*1\ \ 3*2\ \ 4*3\)的和,后一组为\(3*1\ \ 4*2\ \ 5*3\)的和

前一组-后一组:\(2*1\ \ 3*1\ \ 4*1\ \ -5*3\),

可以看出,结果可以表示为:(上一组的所有数的一倍之和) - (当前组最后一个数的 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;
}

标签:AtCoder,ABC,ver,前缀,一组,Index,int,const
From: https://www.cnblogs.com/WAinAll/p/17635880.html

相关文章

  • AtCoder-ABC-309 C - Medicine
    C-Medicine题目大意:给n种药,第i种药吃\(a_i\)天,每天\(b_i\)粒。问最早在第几天,当天要吃的药≤K。\(1<=n<=3*10^5\)\(0<=k<=10^9\)\(1<=a_i,b_i<=10^9\)解题思路首先了解了n种药,每次都是从第一天开始,持续\(a_i\)天,所以我当时直接想到用差分来做,数组初始全为......
  • rails3学习系列(二)MVC---NetworkError: 500 Internal Server Error
    当我创建了一个control文件:backup_for_sqlserver_controller.rb              classBackupForSqlServerController<ScreenController                   defconfig_wizard                   end          ......
  • vnc Unable to licence server: "XML error 0:0 Error: First Tag not found"问题的解
    windows上安装了vncserver,本来每天访问很正常,忽然一天无法访问了。没办法只能卸载重装。但是发现重装以后,不会自动弹出对话框提示输入注册码。手工触发“EnterVNCServerlicensecode”,提示"XMLerror0:0Error:FirstTagnotfound"。调查后,发现是因为windowseventlog这......
  • 函数性能探测:更简单高效的 Serverless 规格选型方案
    作者:拂衣、丛霄2019年Berkeley预测Serverless将取代Serverful计算成为云计算新范式。Serverless为应用开发提供了一种全新系统架构。借助2023年由OpenAI所带来的AIGC风潮,以阿里云函数计算FC、AWSLambda为代表的Serverless以其更高成本效益、更简化的后端代码......
  • 08.25北京站|阿里云Serverless 技术实践营( AI 专场)开放报名
    活动简介阿里云Serverless技术实践营(AI专场)是一场以聚焦企业级AIGC应用开发与落地展开的主题活动,活动受众以关注Serverless和AI技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手场景实操,让开发者通过一个下午的时间增进对Serverless技术的理解,快......
  • 08.25北京站|阿里云Serverless 技术实践营( AI 专场)开放报名
    活动简介阿里云Serverless技术实践营(AI专场)是一场以聚焦企业级AIGC应用开发与落地展开的主题活动,活动受众以关注Serverless和AI技术的开发者、企业决策人、云原生领域创业者为主,活动形式为演讲、动手场景实操,让开发者通过一个下午的时间增进对Serverless技术的理解,快速......
  • SQL_配置sql server数据库路径的小妙招
    配置sqlserver数据库路径的小妙招在桌面上建立一个文本文件,将后缀改成“.udl”,再次打开就可以看到一个图形化的SQL配置界面,根据界面提示就配置好,测试连接成功后,再用记事本打开,复制里面的配置信息就OK了。 ......
  • 【230816-8】▲ABC中,AB=4,BC=2,∠A=α=∠B/2,求:AC=?
    ......
  • Serverless 应用托管助力企业加速创新
    作者:熊峰|阿里云技术专家云原生时代的Serverless应用托管架构回顾过去十年,数字化转型将科技创新与商业元素不断融合、重构,重新定义了新业态下的增长极。商业正在从大工业时代的固化范式进化成面向创新型商业组织与新商业物种的崭新模式。随着数字化转型在中国各行业广泛......
  • teamcenter soa 服务报错:The server returned an internal server。操作执行期间,与Te
     原因:这个是代码有一个空指针,去加载属性所以报这个错误 这一段代码,框起来的就是空......