与えられた条件を満たすような数列で、ある区間の和とある区間の和の間に不等式が成り立つ。
長さを2分探索しながら、その関係に矛盾がないかを調べる。
難しかった。思わす解説を見た。
const int V = 100000; int color[V]; bool rec(int curr, int size, const vector<int> &C) { color[curr] = -1; for (int i = 0; i < C.size(); ++i) { int next = curr + C[i]; if (0 <= next && next <= size) ; else continue; if (color[next] < 0) return false; if (color[next]) continue; if (!rec(next, size, C)) return false; } color[curr] = +1; return true; } bool make_seq(int len, const vector<int> &C) { fill(color, color + V, 0); for (int i = 0; i <= len; ++i) { if (color[i]) continue; if (!rec(i, len, C)) return false; } return true; } class LongestSequence { public: int maxLength(vector <int> C) { int s = 0, b = V - 1; while (s + 1 < b) { int c = (s + b) / 2; if (make_seq(c, C)) s = c; else b = c; } return (V - 2 <= s) ? -1 : s; } };
0 件のコメント :
コメントを投稿