Codeforces Round 909 (Div. 3)----->B. 250 Thousand Tons of TNT(暴力+前缀和优化)

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值