zoukankan      html  css  js  c++  java
  • D. Yet Another Subarray Problem(枚举)

    D. Yet Another Subarray Problem

    time limit per test

    2 seconds

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    You are given an array a1,a2,…,ana1,a2,…,an and two integers mm and kk.

    You can choose some subarray al,al+1,…,ar−1,aral,al+1,…,ar−1,ar.

    The cost of subarray al,al+1,…,ar−1,aral,al+1,…,ar−1,ar is equal to ∑i=lrai−k⌈r−l+1m⌉∑i=lrai−k⌈r−l+1m⌉, where ⌈x⌉⌈x⌉ is the least integer greater than or equal to xx.

    The cost of empty subarray is equal to zero.

    For example, if m=3m=3, k=10k=10 and a=[2,−4,15,−3,4,8,3]a=[2,−4,15,−3,4,8,3], then the cost of some subarrays are:

    • a3…a3:15−k⌈13⌉=15−10=5a3…a3:15−k⌈13⌉=15−10=5;
    • a3…a4:(15−3)−k⌈23⌉=12−10=2a3…a4:(15−3)−k⌈23⌉=12−10=2;
    • a3…a5:(15−3+4)−k⌈33⌉=16−10=6a3…a5:(15−3+4)−k⌈33⌉=16−10=6;
    • a3…a6:(15−3+4+8)−k⌈43⌉=24−20=4a3…a6:(15−3+4+8)−k⌈43⌉=24−20=4;
    • a3…a7:(15−3+4+8+3)−k⌈53⌉=27−20=7a3…a7:(15−3+4+8+3)−k⌈53⌉=27−20=7.

    Your task is to find the maximum cost of some subarray (possibly empty) of array aa.

    Input

    The first line contains three integers nn, mm, and kk (1≤n≤3⋅105,1≤m≤10,1≤k≤1091≤n≤3⋅105,1≤m≤10,1≤k≤109).

    The second line contains nn integers a1,a2,…,ana1,a2,…,an (−109≤ai≤109−109≤ai≤109).

    Output

    Print the maximum cost of some subarray of array aa.

    Examples

    input

    Copy

    7 3 10
    2 -4 15 -3 4 8 3
    

    output

    Copy

    7
    

    input

    Copy

    5 2 1000
    -13 -4 -9 -20 -11
    

    output

    Copy

    0
    

    由表达式可知最后权值中每隔m个就会减k

    那么我们对原数组进行处理每隔m个减去k

    枚举又端点modm的数即可

    #include<bits/stdc++.h>
    using namespace std;
    int a[300005];
    int b[300005];
    int main()
    {
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",a+i);
        }
        long long MAX=0;
        for(int j=0;j<m;j++)
        {
            for(int i=1;i<=n;i++)
            {
                b[i]=a[i];
                if(i%m==j) b[i]-=k;
            }
            long long sum=0;
            for(int i=1;i<=n;i++)
            {
                sum+=b[i];
                if(i%m==j) MAX=max(sum,MAX);
                sum=max(sum,0LL);
            }
        }
        printf("%lld
    ",MAX);
    }
    
  • 相关阅读:
    笔记:Linux进程间通信机制
    Linux下C/C++和lua交互-Table
    @JsonFormat时间格式化注解使用
    关于 mybatis 报invalid comparison: java.util.Arrays$ArrayList and java.lang.String异常
    @RestControllerAdvice作用及原理
    MySQL 中 datetime 和 timestamp 的区别与选择
    idea提交svn忽略.class等文件的相关配置(so easy)
    PLSQL Developer建表时注释(COMMENT)中文乱码的解决方案(Windows)
    oracle客户端安装与配置
    PLSQL安装、PLSQL汉化、激活
  • 原文地址:https://www.cnblogs.com/caowenbo/p/11852242.html
Copyright © 2011-2022 走看看