- Quiz
- AC
- 解説
- aの値が重複していない場合を考えると、小さい値から下図のようにDPしていくと「残せる最大頂点数」が求まる
- aの値が同じものはそれら同士で辺を張ることで条件を満たすので、aの値が重複している場合もほぼ同じで、「残せる最大頂点数」のサイズだけ気をつければいい
- 計算量
void solve(){ ll N;cin>>N; VI A(N); rep(i, N)cin>>A[i]; SORT(A); ll max_value = A.back(); VI C(max_value+1); // count for(ll a : A)C[a]++; VI B = A; // unique values auto it = unique(ALL(B)); B.erase(it, B.end()); VI exist(max_value+1); for(ll b : B)exist[b]=1; auto dp = C; ll max_group_size=MAX(dp); for(ll b : B){ FOR(i,2,max_value+1){ ll v = i*b; if(v>max_value)break; if(exist[v]){ chmax(dp[v], dp[b]+C[v]); chmax(max_group_size, dp[v]); } } } ll ans = N-max_group_size; p(ans); } int main(){ cin.tie(0); ios::sync_with_stdio(false); // input ll N;cin>>N; while(N--)solve(); return 0; }
koboshiさん
F:bを零行列にしてもよい。1文字目が1であるような行に操作を行って、各行がすべて等しくなるかどうか
— いのはらこぼし (競プロ) (@koboshi_kyopro) January 26, 2021
G:ゆきこで見た気がする。xを末尾とする最長増加列の長さを計算