图片说明

题目分析

初次看到这个题目的时候,确实没什么思路,不知道从哪里下手,但是一看题解返现很简单,就是一个前缀和的求法,当时一路陷进了划分的状态,想着如何划分,没想到题目可以这么简单,只需要对其求前缀和不需要去划分,我们排序一下就好了,因为不管我们怎么划分,我们求的最大值一直都在那里,所以我们可以假设把序列从大大小排列,然后,就可以求其潜水和,在每次询问的时候,我们只需要求x*y的值就是当前区间的最大值。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
ll ans = 0, n, x, y, a[maxn], sum[maxn];
int main()
{
    scanf("%lld", &n);
    for (int i = 1; i <= n; ++i)
        scanf("%lld", &a[i]);
    scanf("%lld%lld", &x, &y);
    sort(a + 1, a + n + 1, greater<ll>());
    for (int i = 1; i <= n; ++i)
        sum[i] = sum[i - 1] + a[i];
    for (int i = 1; i <= x; ++i)
        for (int j = 1; j <= y; ++j)
            ans += sum[i * j];
    printf("%lld\n", ans);
}