我没明白为什么量子力学
查看原帖
我没明白为什么量子力学
363036
chlchl楼主2023/8/15 16:14

这代码本地和 IDE 跑样例 1 都是 11,交上 CF 说我输出 −14-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;
}
2023/8/15 16:14
加载中...