線段 做題記錄

coding_goat_qwq發表於2024-10-21

因為一個區間內要滿足 \(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';
}