rt,就是对于断点 i 的选择,答案在区间 [0,n] 上是上凸函数?
具体是怎么发现的就是在猜到这个规律之后,本人没有使用前缀和的方法,而是直接打了一个三分,比较意外的是直接过了。所以这个结论有什么证明的方法吗?
给一下三分的核心代码。
check 求的是断点为 k 时的答案。
#define re register
typedef long long int ll;
ll a[maxn], b[maxn]; int n;
inline __int128 check(int k) {
__int128 s1 = 0, s2 = 0;
for (re int j = 1; j <= k; j++)s1 += a[j] * a[j], s2 += a[j];
for (re int j = k + 1; j <= n; j++)s1 += b[j] * b[j], s2 += b[j];
s1 *= n; s2 = s2 * s2; return s1 - s2;
}
三分的具体核心代码:
while (l < r) {
mid1 = l + (r - l) / 3;
mid2 = r - (r - l) / 3;
if (check(mid1) <= check(mid2))l = mid1 + 1;
else r = mid2 - 1;
}
print(check(l));