题解:P15615 [ICPC 2021 Jakarta R] Maxdifficent Group
aaa1145141919810 · · 题解
题目传送门
这题最大的难度在于看懂题目。把这一大段看起来离人很远的描述翻译成人话就是:把原序列划分为若干子段,每个子段贡献为其中元素之和,求相邻子段贡献之差的绝对值最大能是多少。
我们贪心的考虑,要使相邻子段贡献之差最大化,必然要使一边的贡献取到最大值,一边取到最小值。我们枚举贡献差最大的两相邻子段的分界点
假设以点
然而暴力求解
AC Code
总时间复杂度为
#include<bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 1e5+5;
int n;
LL a[N], psum[2][N], bsum[2][N], ans = -1e18;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
psum[0][i] = max(psum[0][i-1]+a[i], a[i]);//s0
psum[1][i] = min(psum[1][i-1]+a[i], a[i]);//s1
}
for(int i = n; i >= 1; i--) {
bsum[0][i] = max(bsum[0][i+1]+a[i], a[i]);//s2
bsum[1][i] = min(bsum[1][i+1]+a[i], a[i]);//s3
}
for(int i = 1; i < n; i++) {
ans = max(ans, max(psum[0][i]-bsum[1][i+1], bsum[0][i+1]-psum[1][i]));
}
printf("%lld\n", ans);
return 0;
}