这代码本地和 IDE 跑样例 1 都是 1,交上 CF 说我输出 −14,什么逻辑。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 10;
int n, k, a[N], f[N][25];
int now, l = 1, r = 0, tot, cnt[2];
int getans(int s, int t){
while(l > s){
tot += cnt[a[--l]];
cnt[a[l]]++;
}
while(r < t){
tot += cnt[a[++r]];
cnt[a[r]]++;
}
while(l < s){
cnt[a[l]]--;
tot -= cnt[a[l++]];
}
while(r > t){
cnt[a[r]]--;
tot -= cnt[a[r--]];
}
return tot;
}
void dp(int l, int r, int s, int t){
int mid = (l + r) >> 1, idx;
f[mid][now] = 1e16;
for(int i=max(1ll,s);i<=min(mid,t);i++){
int v = f[i - 1][now - 1] + getans(i, mid);
if(f[mid][now] > v)
f[mid][now] = v, idx = i;
}
if(l == r)
return ;
dp(l, mid, s, idx);
dp(mid + 1, r, idx, t);
}
main(){
scanf("%lld%lld", &n, &k);
for(int i=1;i<=n;i++){
scanf("%lld", &a[i]);
f[i][0] = 1e16;
}
for(now=1;now<=k;now++)
dp(1, n, 1, n);
printf("%lld\n", f[n][k]);
return 0;
}