线段 做题记录
因为一个区间内要满足 \(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';
}
本文来自博客园,作者:coding_goat_qwq,转载请注明原文链接:https://www.cnblogs.com/CodingGoat/p/18488313