线段 做题记录

因为一个区间内要满足 \(A_i=kA_{i-1}\) 才会有 \(A_j \bmod A_i = 0\)\(A_i \bmod A_j = 0\)
显然我们只用考虑区间内的数。枚举值域,设 \(f_{i}\) 表示当前选的区间里最小的数,\(cnt_i\) 表示 \(i\) 的出现个数,则有 \(f_i=\max(f_i,f_{ki}+cnt_i)\)。答案为 \(\max(f_i\times i)\)
时间复杂度 \(O(V\log V)\)

点击查看代码
void work() {
	m0(cnt);
	m0(f);
	in1(n);
	inn(a,n);
	For(i,1,n) cnt[a[i]]++;
	int ans=0;
	Rep(i,maxn-1,1) {
		int x=1;
		while(i*x<maxn) {
			f[i]=max(f[i],f[i*x]+cnt[i]);
			x++;
		}
		ans=max(ans,f[i]*i);
	}
	cout<<ans<<'\n';
}
posted @ 2024-10-21 09:12  coding_goat_qwq  阅读(1)  评论(0编辑  收藏  举报