제출 #832032

#제출 시각아이디문제언어결과실행 시간메모리
832032finn__Simurgh (IOI17_simurgh)C++17
51 / 100
87 ms3384 KiB
#include "simurgh.h" #include <bits/stdc++.h> using namespace std; constexpr size_t N = 240; vector<pair<int, int>> g[N]; int adj[N][N]; bitset<N *(N - 1) / 2> checked, is_in; vector<int> find_roads(int n, vector<int> u, vector<int> v) { memset(adj, 255, sizeof adj); for (int i = 0; i < u.size(); ++i) g[u[i]].emplace_back(v[i], i), g[v[i]].emplace_back(u[i], i), adj[u[i]][v[i]] = adj[v[i]][u[i]] = i; vector<int> ans; for (int i = 0; i < n; ++i) { vector<vector<int>> bccs, bcc_trees; vector<int> edge_to_bcc; bitset<N> visited; visited[i] = 1; for (auto const &[z, j] : g[i]) if (!visited[z]) { queue<int> q({z}); visited[z] = 1; edge_to_bcc.push_back(j); vector<int> nodes, edges; while (!q.empty()) { int x = q.front(); nodes.push_back(x); q.pop(); for (auto const &[y, i] : g[x]) if (!visited[y]) { edges.push_back(i); q.push(y); visited[y] = 1; } } bccs.push_back(nodes); bcc_trees.push_back(edges); } for (size_t j = 0; j < bccs.size(); ++j) { vector<int> spanning_tree; for (size_t k = 0; k < bccs.size(); ++k) { spanning_tree.insert(spanning_tree.end(), bcc_trees[k].begin(), bcc_trees[k].end()); if (k != j) spanning_tree.push_back(edge_to_bcc[k]); } for (auto const &x : bccs[j]) if (adj[i][x] != -1) { spanning_tree.push_back(adj[i][x]); break; } int in_overlap = count_common_roads(spanning_tree), out_overlap = in_overlap; vector<int> in; bool skipped = 0, know_in = 0; for (auto const &x : bccs[j]) if (adj[i][x] != -1) { if (!skipped) { checked[adj[i][x]] = 1; in.push_back(adj[i][x]); skipped = 1; continue; } if (checked[adj[i][x]] && know_in) continue; spanning_tree.pop_back(); spanning_tree.push_back(adj[i][x]); int y = count_common_roads(spanning_tree); if (!know_in) { if (checked[adj[i][x]]) { know_in = 1; if (is_in[adj[i][x]]) { if (in_overlap < y) in.clear(), ++in_overlap; else --out_overlap; } else { if (in_overlap == y) in.clear(), ++in_overlap; else --out_overlap; } } if (y == in_overlap) in.push_back(adj[i][x]); else if (y < in_overlap) { out_overlap--; know_in = 1; } else if (y > in_overlap) { know_in = 1; in.clear(); in_overlap++; in.push_back(adj[i][x]); } } else if (y == in_overlap) in.push_back(adj[i][x]); checked[adj[i][x]] = 1; } ans.insert(ans.end(), in.begin(), in.end()); for (auto const &j : in) is_in[j] = 1; } } sort(ans.begin(), ans.end()); ans.resize(unique(ans.begin(), ans.end()) - ans.begin()); return ans; }

컴파일 시 표준 에러 (stderr) 메시지

simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:14:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |     for (int i = 0; i < u.size(); ++i)
      |                     ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...