玄关,为何T掉了,感觉复杂度貌似没啥问题
查看原帖
玄关,为何T掉了,感觉复杂度貌似没啥问题
556740
hzx360楼主2024/3/24 16:22
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define re register
const int N=5e5+100;
const int inf=1e18;
int n,m,cnt[N],dp[N],a[N],sum;
inline void work(int l,int r,int L,int R){
	if(l>r) return;
	sum=0;
	int mid=(l+r)/2,pos,res=inf;
	int lmid=L,rmid=min(R,mid);
//	cout<<mid<<' '<<lmid<<' '<<rmid<<endl;
	for(re int i=mid;i>rmid;i--) sum+=cnt[a[i]],cnt[a[i]]++;
	for(re int i=rmid;i>=lmid;i--){
		sum+=cnt[a[i]],cnt[a[i]]++;
		if(dp[i-1]+sum<res) res=dp[i-1]+sum,pos=i;
	}
	for(re int i=mid;i>=lmid;i--) cnt[a[i]]=0;
	work(mid+1,r,pos,R),dp[mid]=res,work(l,mid-1,L,pos);
	return;
}
signed main(){
	cin>>n>>m;
	for(re int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(re int i=1;i<=n;i++) dp[i]=inf; 
	for(re int i=1;i<=m;i++) work(1,n,1,n);
	cout<<dp[n];
	return 0;
}
2024/3/24 16:22
加载中...