結果
問題 | No.979 Longest Divisor Sequence |
ユーザー | shop_one |
提出日時 | 2020-01-31 22:56:34 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 1,502 ms / 2,000 ms |
コード長 | 1,260 bytes |
コンパイル時間 | 876 ms |
コンパイル使用メモリ | 88,520 KB |
実行使用メモリ | 21,568 KB |
最終ジャッジ日時 | 2024-09-17 09:57:37 |
合計ジャッジ時間 | 3,774 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 8 ms
15,156 KB |
testcase_01 | AC | 7 ms
15,260 KB |
testcase_02 | AC | 8 ms
15,200 KB |
testcase_03 | AC | 8 ms
15,368 KB |
testcase_04 | AC | 8 ms
15,236 KB |
testcase_05 | AC | 8 ms
15,280 KB |
testcase_06 | AC | 8 ms
15,200 KB |
testcase_07 | AC | 8 ms
15,192 KB |
testcase_08 | AC | 9 ms
15,248 KB |
testcase_09 | AC | 9 ms
15,164 KB |
testcase_10 | AC | 22 ms
15,408 KB |
testcase_11 | AC | 22 ms
15,432 KB |
testcase_12 | AC | 22 ms
15,336 KB |
testcase_13 | AC | 43 ms
19,512 KB |
testcase_14 | AC | 1,502 ms
21,568 KB |
testcase_15 | AC | 488 ms
17,968 KB |
ソースコード
// I SELL YOU...! #include<iostream> #include<vector> #include<algorithm> #include<functional> #include<queue> #include<chrono> #include<iomanip> #include<map> #include<set> #define MAX_N 310000 using namespace std; using ll = long long; using P = pair<ll,ll>; vector<ll> a(MAX_N),dp(MAX_N),idx[MAX_N]; void init_io(){ cin.tie(0); ios::sync_with_stdio(false); cout << setprecision(10); } vector< ll > divisor(ll n) { vector< ll > ret; for(ll i = 1; i * i <= n; i++) { if(n % i == 0) { ret.push_back(i); if(i * i != n) ret.push_back(n / i); } } sort(begin(ret), end(ret)); return (ret); } signed main(){ init_io(); ll n; cin >> n; dp[0] = 1; for(int i=0;i<n;i++){ cin >> a[i]; idx[a[i]].push_back(i); } ll ans = 1; vector<ll> divi; for(ll i=1;i<n;i++){ divi = divisor(a[i]); ll great = 0; for(auto v:divi){ if(idx[v].size()==0)continue; if(v==a[i]) continue; auto itr = lower_bound(idx[v].begin(),idx[v].end(),i); if(itr==idx[v].begin()&&*itr>=i) continue; itr--; ll d = *itr; //cout << d<<" "<<v<<" "<<i<<endl; great = max(great,dp[d]); } dp[i] = great+1; ans = max(dp[i],ans); divi.clear(); } cout << ans << endl; }