結果
問題 | No.497 入れ子の箱 |
ユーザー | まいん- |
提出日時 | 2017-03-29 21:15:40 |
言語 | C++11 (gcc 11.4.0) |
結果 |
AC
|
実行時間 | 118 ms / 5,000 ms |
コード長 | 4,888 bytes |
コンパイル時間 | 1,427 ms |
コンパイル使用メモリ | 111,604 KB |
実行使用メモリ | 21,176 KB |
最終ジャッジ日時 | 2024-07-06 15:09:15 |
合計ジャッジ時間 | 5,335 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 3 ms
7,280 KB |
testcase_01 | AC | 3 ms
7,292 KB |
testcase_02 | AC | 4 ms
7,424 KB |
testcase_03 | AC | 91 ms
21,080 KB |
testcase_04 | AC | 116 ms
20,972 KB |
testcase_05 | AC | 117 ms
21,120 KB |
testcase_06 | AC | 117 ms
21,004 KB |
testcase_07 | AC | 117 ms
20,992 KB |
testcase_08 | AC | 115 ms
20,992 KB |
testcase_09 | AC | 115 ms
21,120 KB |
testcase_10 | AC | 116 ms
21,036 KB |
testcase_11 | AC | 115 ms
21,064 KB |
testcase_12 | AC | 115 ms
14,600 KB |
testcase_13 | AC | 117 ms
14,456 KB |
testcase_14 | AC | 116 ms
14,208 KB |
testcase_15 | AC | 117 ms
14,464 KB |
testcase_16 | AC | 117 ms
14,592 KB |
testcase_17 | AC | 118 ms
14,308 KB |
testcase_18 | AC | 114 ms
21,120 KB |
testcase_19 | AC | 111 ms
21,120 KB |
testcase_20 | AC | 111 ms
21,176 KB |
testcase_21 | AC | 113 ms
20,864 KB |
testcase_22 | AC | 111 ms
20,992 KB |
testcase_23 | AC | 72 ms
7,404 KB |
testcase_24 | AC | 73 ms
7,548 KB |
testcase_25 | AC | 3 ms
7,296 KB |
testcase_26 | AC | 3 ms
7,296 KB |
testcase_27 | AC | 117 ms
17,280 KB |
testcase_28 | AC | 116 ms
17,152 KB |
testcase_29 | AC | 114 ms
17,044 KB |
testcase_30 | AC | 89 ms
7,480 KB |
testcase_31 | AC | 89 ms
7,560 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 = 1010; DGraph dgraph; vector<int> nodes; int nodes_i; 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[nodes_i++] = 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); } } } } vector<int>& tsort(DGraph& dg) { dgraph = dg; nodes = vector<int>(dgraph.size(), -1); used.fill(false); indeg.fill(0); nodes_i = 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 nodes = TSort::tsort(dgraph); 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; }