結果
問題 | No.497 入れ子の箱 |
ユーザー | まいん- |
提出日時 | 2017-03-29 20:55:09 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 125 ms / 5,000 ms |
コード長 | 4,850 bytes |
コンパイル時間 | 1,072 ms |
コンパイル使用メモリ | 115,196 KB |
実行使用メモリ | 26,112 KB |
最終ジャッジ日時 | 2024-07-06 15:07:14 |
合計ジャッジ時間 | 5,315 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 5 ms
12,272 KB |
testcase_01 | AC | 4 ms
12,400 KB |
testcase_02 | AC | 3 ms
12,276 KB |
testcase_03 | AC | 97 ms
26,012 KB |
testcase_04 | AC | 123 ms
25,984 KB |
testcase_05 | AC | 122 ms
25,984 KB |
testcase_06 | AC | 121 ms
25,984 KB |
testcase_07 | AC | 122 ms
25,856 KB |
testcase_08 | AC | 122 ms
25,728 KB |
testcase_09 | AC | 122 ms
25,984 KB |
testcase_10 | AC | 123 ms
25,984 KB |
testcase_11 | AC | 124 ms
25,984 KB |
testcase_12 | AC | 122 ms
19,712 KB |
testcase_13 | AC | 125 ms
19,456 KB |
testcase_14 | AC | 124 ms
19,252 KB |
testcase_15 | AC | 122 ms
19,456 KB |
testcase_16 | AC | 122 ms
19,708 KB |
testcase_17 | AC | 122 ms
19,328 KB |
testcase_18 | AC | 120 ms
25,984 KB |
testcase_19 | AC | 119 ms
25,984 KB |
testcase_20 | AC | 118 ms
26,112 KB |
testcase_21 | AC | 118 ms
26,112 KB |
testcase_22 | AC | 118 ms
25,984 KB |
testcase_23 | AC | 77 ms
12,416 KB |
testcase_24 | AC | 78 ms
12,392 KB |
testcase_25 | AC | 5 ms
12,148 KB |
testcase_26 | AC | 5 ms
12,272 KB |
testcase_27 | AC | 122 ms
22,144 KB |
testcase_28 | AC | 122 ms
22,272 KB |
testcase_29 | AC | 120 ms
22,028 KB |
testcase_30 | AC | 95 ms
12,416 KB |
testcase_31 | AC | 94 ms
12,544 KB |
ソースコード
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <stack> #include <queue> #include <functional> #include <algorithm> #include <map> #include <unordered_map> #include <set> #include <unordered_set> #include <vector> #include <array> #include <tuple> #include <utility> #include <numeric> #include <iomanip> #include <cctype> #include <cmath> #include <assert.h> #include <cstdlib> #include <list> using namespace std; using ll = long long; using ull = unsigned long long; using PII = pair<int, int>; using PLL = pair<ll, ll>; template<typename T1, typename T2> ostream& operator<<(ostream& s, const pair<T1, T2>& p) { return s << "(" << p.first << ", " << p.second << ")"; } template<typename T> ostream& operator<<(ostream& s, const vector<T>& v) { s << "["; for (int i = 0; i < v.size(); i++) s << (i == 0 ? "" : ", ") << v[i]; s << "]"; return s; } #define ALL(a) (a).begin(), (a).end() using Weight = int; // 重み付きの辺 struct Edge { int from, to; Weight weight; Edge() {} Edge(int to) : from(-1), to(to), weight(-1) {} Edge(int from, int to) : from(from), to(to), weight(-1) {} Edge(int from, int to, Weight weight) : from(from), to(to), weight(weight) {} bool operator<(const Edge& e) const { return (weight != e.weight) ? (weight < e.weight) : (from < e.from); } bool operator>(const Edge& e) const { return (weight != e.weight) ? (weight > e.weight) : (from > e.from); } }; using Arc = Edge; using Graph = vector<vector<Edge>>; using DGraph = vector<vector<Arc>>; using Tree = Graph; // 最初に初期化することを忘れないように! using GArray = vector<Weight>; using GMatrix = vector<GArray>; // この4つの関数は頂点数を固定したバージョンでも動く void add_edge(Graph& g, int u, int v, Weight w = -1) { g[u].push_back(Edge(u, v, w)); g[v].push_back(Edge(v, u, w)); } void add_arc(DGraph& dg, int u, int v, Weight w = -1) { dg[u].push_back(Arc(u, v, w)); } const int GM_INF = (1LL << 25); void init_gmatrix(GMatrix& gm) { for (int u = 0; u < gm.size(); u++) { for (int v = 0; v < gm[u].size(); v++) { gm[u][v] = GM_INF; } } } void add_edge(GMatrix& gm, int u, int v, Weight w = -1) { gm[u][v] = w; gm[v][u] = w; } void add_arc(GMatrix& gm, int u, int v, Weight w = -1) { gm[u][v] = w; } namespace TSort { const int MAX_V = 1000010; DGraph dgraph; list<int> nodes; array<bool, MAX_V> used; array<int, MAX_V> indeg; void bfs(int s) { queue<int> que; que.push(s); used[s] = true; while (!que.empty()) { int v = que.front(); que.pop(); nodes.push_back(v); for (Arc a : dgraph[v]) { indeg[a.to]--; if (indeg[a.to] == 0 && !used[a.to]) { used[a.to] = true; que.push(a.to); } } } } list<int>& tsort(DGraph& dg) { dgraph = dg; nodes.clear(); used.fill(false); indeg.fill(0); for (int v = 0; v < dgraph.size(); v++) { for (Arc a : dgraph[v]) { indeg[a.to]++; } } for (int v = 0; v < dgraph.size(); v++) { if (indeg[v] == 0 && !used[v]) { bfs(v); } } return nodes; } }; const int MAX_N = 1010; vector<int> x, y, z; int table[MAX_N][MAX_N]; bool can_contain(int u, int v) { vector<int> us{x[u], y[u], z[u]}, vs{x[v], y[v], z[v]}; sort(ALL(us)); sort(ALL(vs)); for (int i = 0; i < 3; i++) { if (us[i] <= vs[i]) return false; } return true; } int main() { int n; cin >> n; x.resize(n); y.resize(n); z.resize(n); DGraph dgraph(n); for (int i = 0; i < n; i++) { cin >> x[i] >> y[i] >> z[i]; } for (int u = 0; u < n; u++) { for (int v = 0; v < n; v++) { if (can_contain(u, v)) { add_arc(dgraph, u, v); } } } auto nl = TSort::tsort(dgraph); vector<int> nodes(ALL(nl)); memset(table, -1, sizeof(table)); int ans = -1; for (int i = 0; i < n; i++) { table[i][nodes[i]] = max(table[i][nodes[i]], 1); for (int j = 0; j < n; j++) { ans = max(ans, table[i][j]); if (table[i][j] < 0 || i == n - 1) continue; table[i + 1][j] = max(table[i + 1][j], table[i][j]); if (can_contain(j, nodes[i + 1])) { table[i + 1][nodes[i + 1]] = max(table[i + 1][nodes[i + 1]], table[i][j] + 1); } } } cout << ans << endl; return 0; }