Submission #960336

#TimeUsernameProblemLanguageResultExecution timeMemory
960336TAhmed33Longest Trip (IOI23_longesttrip)C++17
15 / 100
819 ms1900 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; vector <int> adj[256], tree[256]; bool vis[256]; struct DSU { int p[256], sze[256]; void init (int n) { for (int i = 0; i < n; i++) { p[i] = i; sze[i] = 1; } } int find (int x) { return p[x] == x ? x : p[x] = find(p[x]); } bool merge (int a, int b) { a = find(a), b = find(b); if (a == b) return 0; if (sze[a] > sze[b]) swap(a, b); sze[b] += sze[a]; p[a] = b; return 1; } } cur; vector <int> x; int p[256]; void dfs (int pos) { vis[pos] = 1; x.push_back(pos); for (auto j : adj[pos]) { if (vis[j]) continue; tree[pos].push_back(j); p[j] = pos; dfs(j); } } int get (int x) { if (tree[x].empty()) return x; return get(tree[x][0]); } vector <int> longest_trip (int n, int d) { for (int i = 0; i < n; i++) adj[i].clear(), tree[i].clear(); memset(p, -1, sizeof(p)); cur.init(n); for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { if (are_connected({i}, {j})) { adj[i].push_back(j); adj[j].push_back(i); cur.merge(i, j); } } } bool flag = 0; for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { flag |= cur.merge(i, j); } } if (flag) { memset(vis, 0, sizeof(vis)); vector <int> ret; for (int i = 0; i < n; i++) { if (!vis[i]) { x.clear(); dfs(i); if ((int)x.size() > (int)ret.size()) ret = x; } } return ret; } memset(vis, 0, sizeof(vis)); x.clear(); dfs(0); int pos = -1; for (int i = 0; i < n; i++) { assert((int)tree[i].size() <= 2); if ((int)tree[i].size() == 2) { assert(pos == -1); pos = i; } } if (pos == -1) return x; int u = get(tree[pos][0]), v = get(tree[pos][1]); if (p[pos] != -1 && find(adj[p[pos]].begin(), adj[p[pos]].end(), u) == adj[p[pos]].end()) swap(u, v); //if (p[pos] != -1) assert(find(adj[p[pos]].begin(), adj[p[pos]].end(), u) != adj[p[pos]].end()); auto g = find(x.begin(), x.end(), pos); x.erase(g); g = find(x.begin(), x.end(), u); g++; x.insert(g, pos); for (int i = 1; i < (int)x.size(); i++) { auto u = find(adj[x[i]].begin(), adj[x[i]].end(), x[i - 1]); // assert(u != adj[x[i]].end()); } return x; }

Compilation message (stderr)

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:88:14: warning: variable 'u' set but not used [-Wunused-but-set-variable]
   88 |         auto u = find(adj[x[i]].begin(), adj[x[i]].end(), x[i - 1]);
      |              ^
#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...