結果
問題 | No.979 Longest Divisor Sequence |
ユーザー | zeke |
提出日時 | 2020-02-04 15:51:14 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,292 ms / 2,000 ms |
コード長 | 3,829 bytes |
コンパイル時間 | 1,058 ms |
コンパイル使用メモリ | 105,932 KB |
実行使用メモリ | 13,436 KB |
最終ジャッジ日時 | 2024-09-21 07:24:00 |
合計ジャッジ時間 | 3,552 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 6 ms
11,008 KB |
testcase_01 | AC | 6 ms
10,984 KB |
testcase_02 | AC | 6 ms
11,064 KB |
testcase_03 | AC | 6 ms
10,984 KB |
testcase_04 | AC | 6 ms
11,044 KB |
testcase_05 | AC | 6 ms
10,996 KB |
testcase_06 | AC | 6 ms
10,920 KB |
testcase_07 | AC | 6 ms
11,104 KB |
testcase_08 | AC | 6 ms
10,860 KB |
testcase_09 | AC | 6 ms
11,000 KB |
testcase_10 | AC | 19 ms
11,044 KB |
testcase_11 | AC | 19 ms
11,244 KB |
testcase_12 | AC | 19 ms
11,196 KB |
testcase_13 | AC | 24 ms
13,432 KB |
testcase_14 | AC | 1,292 ms
13,436 KB |
testcase_15 | AC | 434 ms
11,780 KB |
ソースコード
/* Author:zeke pass System Test! GET AC!! */ #include <iostream> #include <queue> #include <vector> #include <iostream> #include <vector> #include <string> #include <cassert> #include <algorithm> #include <functional> #include <cmath> #include <queue> #include <set> #include <stack> #include <deque> #include <map> #include <iomanip> #include <utility> #include <stack> #include <bitset> using ll = long long; using ld = long double; using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define all(x) (x).begin(), (x).end() #define rep3(var, min, max) for (ll(var) = (min); (var) < (max); ++(var)) #define repi3(var, min, max) for (ll(var) = (max)-1; (var) + 1 > (min); --(var)) #define Mp(a, b) make_pair((a), (b)) #define F first #define S second #define Icin(s) \ ll(s); \ cin >> (s); #define Scin(s) \ ll(s); \ cin >> (s); template <class T> bool chmax(T &a, const T &b) { if (a < b) { a = b; return 1; } return 0; } template <class T> bool chmin(T &a, const T &b) { if (b < a) { a = b; return 1; } return 0; } typedef pair<ll, ll> P; typedef vector<ll> V; typedef vector<V> VV; typedef vector<P> VP; ll mod = 1e9 + 7; ll MOD = 1e9 + 7; ll INF = 1e18; //const int INF = 7 + (1e+9); typedef int Weight; struct Edge { //src:辺の始点,dst:辺の終点,weight:辺の重さ int src, dst; Weight weight; Edge(int src, int dst, Weight weight) : src(src), dst(dst), weight(weight) {} }; bool operator<(const Edge &e, const Edge &f) { return e.weight != f.weight ? e.weight > f.weight : //辺は重さが重いものを"小さい"と定義する e.src != f.src ? e.src < f.src : e.dst < f.dst; } typedef vector<Edge> Edges; typedef vector<Edges> Graph; //引数 g:隣接リスト,s:始点,dist:各頂点までの距離が入る,prev:最短路木の親頂点が入る //戻値 なし void shortestPath(const Graph &g, int s, vector<Weight> &dist, vector<int> &prev) { int n = g.size(); dist.assign(n, INF); dist[s] = 0; prev.assign(n, -1); priority_queue<Edge> Q; Q.push(Edge(-2, s, 0)); while (!Q.empty()) { Edge e = Q.top(); Q.pop(); if (prev[e.dst] != -1) continue; prev[e.dst] = e.src; for (auto f = g[e.dst].begin(); f != g[e.dst].end(); f++) { if (dist[f->dst] > e.weight + f->weight) { dist[f->dst] = e.weight + f->weight; Q.push(Edge(f->src, f->dst, e.weight + f->weight)); } } } } //引数 prev:最短路木の親頂点集合,t:終点 //戻値 path:sからtへの最短経路 vector<int> buildPath(const vector<int> &prev, int t) { vector<int> path; for (int u = t; u >= 0; u = prev[u]) path.push_back(u); reverse(path.begin(), path.end()); return path; } /*int main() { // ... Graph g(v); //頂点数vの空隣接リストgを生成 // ... g[s].push_back(Edge(s, t, w)); //隣接リストgにsからtに向かう重さwの辺を追加 // ... vector<Weight> dist; vector<int> prev; shortestPath(g, 0, dist, prev); // ... }*/ int main() { cin.tie(0); ios::sync_with_stdio(false); ll n; cin >> n; V vec(n); V dp(1e6); rep(i, n)cin >> vec[i]; rep(i, n) { for(ll j=1;j*j<=vec[i];++j) { if(vec[i]==1)dp[1]=1; if(j>=vec[i])break; if (vec[i] % j == 0) { chmax(dp[vec[i]], dp[j] + 1); if(vec[i]!=vec[i]/j)chmax(dp[vec[i]],dp[vec[i]/j]+1); } } } ll res=0; rep(i,1e6){ // cout<<dp[i]<<" "; chmax(res, dp[i]); } // cout<<endl; cout << res << endl; }