MLE求助
查看原帖
MLE求助
1433357
Creeper8459楼主2025/6/29 22:43

125MB过不了,求助

#include <bits/stdc++.h>
#define P 10007
#define mid (l + r >> 1)
using namespace std;
const int N = 50005;
int n, m, l, r, k, s, t, S[N], a[N], f[N][1005], sum[N][1005];
// f[i][j]=f[k][j-1] (S[i]-S[k]<=mid)
int check(int M){
	int now = 0, tot = 1;
	for (int i = 1; i <= n; ++i){
		if (now + a[i] <= M) now += a[i];
		else now = a[i], ++tot;
	}
	if (tot <= m) return 1;
	else return 0;
}
int main(){
	cin >> n >> m; ++m;
	for (int i = 1; i <= n; ++i){
		cin >> a[i];
		S[i] = S[i - 1] + a[i];
		l = max(l, a[i]); r += a[i];
	}
	while (l <= r){
		if (check(mid)) r = mid - 1;
		else l = mid + 1;
	}
	int ans = l, tmp = 0;
	f[0][0] = 1;
	for (int i = 0; i <= n; ++i)
		sum[i][0] = 1;
	int k = -1;
	for (int i = 1; i <= n; ++i){
		while (S[i] - S[k + 1] > ans)
			++k;
		for (int j = 1; j <= min(i, m); ++j){
			f[i][j] = (sum[i - 1][j - 1] - (k == -1 ? 0 : sum[k][j - 1])) % P;
			sum[i][j] = (sum[i - 1][j] + f[i][j]) % P;
		}
	}
	for (int j = 1; j <= m; ++j)
		tmp = (tmp + f[n][j]) % P;
	cout << ans << ' ' << (tmp + P) % P;
}
2025/6/29 22:43
加载中...