Submission #1076306

#TimeUsernameProblemLanguageResultExecution timeMemory
1076306c2zi6Longest Trip (IOI23_longesttrip)C++17
5 / 100
912 ms1216 KiB
#define _USE_MATH_DEFINES #include <bits/stdc++.h> #define ff first #define ss second #define pb push_back #define all(a) (a).begin(), (a).end() #define replr(i, a, b) for (int i = int(a); i <= int(b); ++i) #define reprl(i, a, b) for (int i = int(a); i >= int(b); --i) #define rep(i, n) for (int i = 0; i < int(n); ++i) #define mkp(a, b) make_pair(a, b) using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> PII; typedef vector<int> VI; typedef vector<PII> VPI; typedef vector<VI> VVI; typedef vector<VVI> VVVI; typedef vector<VPI> VVPI; typedef pair<ll, ll> PLL; typedef vector<ll> VL; typedef vector<PLL> VPL; typedef vector<VL> VVL; typedef vector<VVL> VVVL; typedef vector<VPL> VVPL; template<class T> T setmax(T& a, T b) {if (a < b) return a = b; return a;} template<class T> T setmin(T& a, T b) {if (a < b) return a; return a = b;} #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template<class T> using indset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #include "longesttrip.h" bool commonedge(VI a, VI b) { return !are_connected(a, b); } bool commonedge(int u, int v) { return !are_connected({u}, {v}); } int n; VVI gp; VVI gpmatrix; int mex(VI a) { set<int> st; for (int x : a) st.insert(x); for (int i = 0; i < 2e9; i++) if (st.count(i) == 0) return i; return -1; } VI longest_trip(int N, int D) { /*if (D >= 2) {*/ /* int n = N;*/ /* VI group(n, -1);*/ /* int last = 0;*/ /* rep(u, n) if (group[u] == -1) {*/ /* group[u] = last;*/ /* rep(v, n) if (group[v] == -1) {*/ /* if (commonedge({u}, {v})) group[v] = last;*/ /* }*/ /* last++;*/ /* }*/ /* VVI comp(last);*/ /* rep(u, n) comp[group[u]].pb(u);*/ /* sort(all(comp), [&](const VI& a, const VI& b){return a.size() > b.size();});*/ /* int prev = -1;*/ /* VI ans;*/ /* rep(_, 3) {*/ /* rep(i, last) {*/ /* assert(comp[i].size() <= 2);*/ /* if (comp[i].size() && i != prev) {*/ /* ans.pb(comp[i].back());*/ /* comp[i].pop_back();*/ /* prev = i;*/ /* }*/ /* }*/ /* }*/ /* rep(i, last) assert(comp[i].size() == 0);*/ /* return ans;*/ /*}*/ n = N; gp = VVI(n); gpmatrix = VVI(n, VI(n)); replr(u, 0, n-1) { replr(v, u+1, n-1) { if (commonedge(u, v)) { gp[u].pb(v); gp[v].pb(u); gpmatrix[u][v] = gpmatrix[v][u] = true; /*cout << "found edge " << u << " " << v << endl;*/ } } } VI vis(n); VI group(n, -1); int l = 0; rep(u, n) { VI ret; for (int v : gp[u]) if (group[v] != -1) ret.pb(group[v]); group[u] = mex(ret); setmax(l, group[u]+1); } VVI comp(l); rep(u, n) comp[group[u]].pb(u); mt19937 rng(chrono::steady_clock().now().time_since_epoch().count()); for (VI& a : comp) shuffle(all(a), rng); VI ans; int prev = -1; while (true) { bool ayo = false; for (VI& a : comp) { VI nw; for (int x : a) { if (prev != -1 && gpmatrix[x][prev]) { nw.pb(x); continue; } ans.pb(x); prev = x; ayo = true; } a = nw; } if (ayo == false) break; } return ans; /*vis = VI(l);*/ /*for (VI vec : comp) {*/ /* for (int x : vec) cout << x << " ";*/ /* cout << endl;*/ /*}*/ return {-1488}; }
#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...