Submission #329271

#TimeUsernameProblemLanguageResultExecution timeMemory
329271quocnguyen1012Meetings (JOI19_meetings)C++14
100 / 100
1200 ms1088 KiB
#ifndef LOCAL #include "meetings.h" #endif // LOCAL #ifdef LOCAL #include <cstdio> #include <cstdlib> #include <algorithm> #include <set> #include <utility> #include <vector> namespace { const int MAX_N = 2000; const int MAX_CALLS = 100000; void WrongAnswer(int code) { printf("Wrong Answer [%d]\n", code); exit(0); } int N, num_calls; std::vector<int> graph[MAX_N]; std::set<std::pair<int, int>> edges, edges_reported; int weight[MAX_N]; bool Visit(int p, int e, int rt = -1) { if (p == e) { ++weight[p]; return true; } for (int q : graph[p]) { if (q != rt) { if (Visit(q, e, p)) { ++weight[p]; return true; } } } return false; } } // namespace int Query(int u, int v, int w) { if (!(0 <= u && u <= N - 1 && 0 <= v && v <= N - 1 && 0 <= w && w <= N - 1 && u != v && u != w && v != w)) { WrongAnswer(1); } if (++num_calls > MAX_CALLS) { WrongAnswer(2); } std::fill(weight, weight + N, 0); Visit(u, v); Visit(u, w); Visit(v, w); for (int x = 0; x < N; ++x) { if (weight[x] == 3) { return x; } } printf("Error: the input may be invalid\n"); exit(0); } void Bridge(int u, int v) { if (!(0 <= u && u < v && v <= N - 1)) { WrongAnswer(3); } if (!(edges.count(std::make_pair(u, v)) >= 1)) { WrongAnswer(4); } if (!(edges_reported.count(std::make_pair(u, v)) == 0)) { WrongAnswer(5); } edges_reported.insert(std::make_pair(u, v)); } void Solve(int N); int main() { #ifdef LOCAL freopen("A.INP", "r", stdin); freopen("A.OUT", "w", stdout); #endif // LOCAL if (scanf("%d", &N) != 1) { fprintf(stderr, "Error while reading input\n"); exit(1); } for (int i = 0; i < N - 1; ++i) { int u, v; if (scanf("%d%d", &u, &v) != 2) { fprintf(stderr, "Error while reading input\n"); exit(1); } graph[u].push_back(v); graph[v].push_back(u); edges.insert(std::make_pair(u, v)); } num_calls = 0; Solve(N); if (edges_reported.size() != static_cast<size_t>(N - 1)) { WrongAnswer(6); } printf("Accepted: %d\n", num_calls); return 0; } #endif // LOCAL #include <bits/stdc++.h> using namespace std; using ll = long long; mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int maxn = 2005; vector<int> sub[maxn]; int n; int query(int x, int y, int z) { if (x == y || z == x) return x; if (y == z) return y; return Query(x, y, z); } void dfs(int root) { if (sub[root].empty()) return; int v = sub[root][rng() % sub[root].size()]; vector<int> path; vector<int> tmp; swap(tmp, sub[root]); path.push_back(root); path.push_back(v); for (int u : tmp) { if (u == v) continue; int lca = query(root, u, v); path.push_back(lca); if (lca != u) { sub[lca].push_back(u); } } sort(path.begin(), path.end()); path.erase(unique(path.begin(), path.end()), path.end()); sort(path.begin(), path.end(), [&](int x, int y) { return query(root, x, y) == x; }); auto answer = [&](int u, int v) { if (u > v) swap(u, v); Bridge(u, v); }; for (int i = 0; i + 1 < path.size(); ++i) { answer(path[i], path[i + 1]); } for (int u : path) dfs(u); } void Solve(int _N) { n = _N; for (int i = 1; i < n; ++i) sub[0].push_back(i); dfs(0); }

Compilation message (stderr)

meetings.cpp: In function 'void dfs(int)':
meetings.cpp:155:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  155 |   for (int i = 0; i + 1 < path.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...