#include <bits/stdc++.h> using namespace std; struct TestCase { size_t N; vector<size_t> permutation; }; TestCase read_test_case(); void solve_test_case(const TestCase &); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve_test_case(read_test_case()); } TestCase read_test_case() { TestCase tc; cin >> tc.N; tc.permutation.resize(tc.N); for (auto &x : tc.permutation) cin >> x; return tc; } struct Graph { vector<vector<size_t>> nodes; }; size_t get_sum_from(const Graph &graph, size_t source); void solve_test_case(const TestCase &tc) { Graph graph; graph.nodes.resize(tc.N); for (size_t i = 0; i < tc.N; i++) for (size_t j = 0; j < i; j++) { if (tc.permutation[i] < tc.permutation[j]) { graph.nodes[i].push_back(j); graph.nodes[j].push_back(i); } } for (size_t i = 0; i < tc.N; i++) cout << get_sum_from(graph, i) << " "; cout << "\n"; } size_t get_sum_from(const Graph &graph, size_t source) { size_t sum = 0; vector<bool> visited(graph.nodes.size()); queue<pair<size_t, size_t>> q; q.push({source, 0}); visited[source] = true; while (!q.empty()) { auto [current, d] = q.front(); q.pop(); sum += d; for (auto next : graph.nodes[current]) if (!visited[next]) { visited[next] = true; q.push({next, d + 1}); } } return sum; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | #include <bits/stdc++.h> using namespace std; struct TestCase { size_t N; vector<size_t> permutation; }; TestCase read_test_case(); void solve_test_case(const TestCase &); int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); solve_test_case(read_test_case()); } TestCase read_test_case() { TestCase tc; cin >> tc.N; tc.permutation.resize(tc.N); for (auto &x : tc.permutation) cin >> x; return tc; } struct Graph { vector<vector<size_t>> nodes; }; size_t get_sum_from(const Graph &graph, size_t source); void solve_test_case(const TestCase &tc) { Graph graph; graph.nodes.resize(tc.N); for (size_t i = 0; i < tc.N; i++) for (size_t j = 0; j < i; j++) { if (tc.permutation[i] < tc.permutation[j]) { graph.nodes[i].push_back(j); graph.nodes[j].push_back(i); } } for (size_t i = 0; i < tc.N; i++) cout << get_sum_from(graph, i) << " "; cout << "\n"; } size_t get_sum_from(const Graph &graph, size_t source) { size_t sum = 0; vector<bool> visited(graph.nodes.size()); queue<pair<size_t, size_t>> q; q.push({source, 0}); visited[source] = true; while (!q.empty()) { auto [current, d] = q.front(); q.pop(); sum += d; for (auto next : graph.nodes[current]) if (!visited[next]) { visited[next] = true; q.push({next, d + 1}); } } return sum; } |