1.首先我们要知道,题目的本质就是再问怎样均分才会使最大值和最小值差值最大。(必须按前后循序分配)
2.我们只需要枚举n的因数有哪些,分别求他们的区间和,并维护最大值和最小值(具体看代码)
3.代码
#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 2e5;
typedef long long ll;
ll s[N];
void sovle() {
memset(s, 0, sizeof s);
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> s[i];
//前缀和
s[i] += s[i - 1];
}
//枚举n的所有因数(时间复杂度为因数的个数 < sqrt(n))
ll res = 0;
for (int i = 1; i <= n; i++) {
if (n % i != 0) continue;
ll mx = 0, mi = 1e18;
//枚举每一个区间(时间复杂度 < n)
for (int j = i; j <= n; j += i) {
mx = max(mx, s[j] - s[j - i]);
mi = min(mi, s[j] - s[j - i]);
}
res = max(res, mx - mi);
}
//总的时间复杂度 < n*sqrt(n)-(n是1e5级别)
cout << res << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin >> t;
while (t--) {
sovle();
}
return 0;
}