Submission #1064029

#TimeUsernameProblemLanguageResultExecution timeMemory
1064029vjudge1Thousands Islands (IOI22_islands)C++17
24 / 100
74 ms16312 KiB
#include "islands.h" #include <bits/stdc++.h> using namespace std; using vi = vector<int>; using ii = pair<int, int>; void validate(vi Sol, int n, int m, vi &U, vi &V) { int u = 0; vi stare(m, 0); assert(!Sol.empty()); for(int i = 0; i + 1 < int(Sol.size()); ++i) assert(Sol[i] != Sol[i + 1]); for(auto it : Sol) { if(!stare[it]) { assert(u == U[it]); } else { assert(u == V[it]); } stare[it] ^= 1; assert(u == U[it] || u == V[it]); u = u ^ U[it] ^ V[it]; } assert(u == 0); for(int i = 0; i < m; ++i) assert(!stare[i]); } variant<bool, vi> find_journey(int n, int m, vi U, vi V) { vector<set<int> > Smuchii(n), Smuchii2(n); vector<bool> activ(n, true); vi InDeg(n, 0), OutDeg(n, 0); for(int i = 0; i < m; ++i) { Smuchii[U[i]].insert(V[i]); Smuchii2[V[i]].insert(U[i]); ++OutDeg[U[i]]; ++InDeg[V[i]]; } set<int> DeSters; for(int i = 0; i < n; ++i) { if((!InDeg[i] && i != 0) || !OutDeg[i]) { DeSters.insert(i); } } while(!DeSters.empty()) { int u = *DeSters.begin(); DeSters.erase(u); activ[u] = false; for(auto it : Smuchii[u]) { --InDeg[it]; Smuchii2[it].erase(u); if(!InDeg[it] && activ[it]) { DeSters.insert(it); } } for(auto it : Smuchii2[u]) { --OutDeg[it]; Smuchii[it].erase(u); if(!OutDeg[it] && activ[it]) { DeSters.insert(it); } } } if(!activ[0]) return false; ///am curatat graful vector<vector<ii> > L(n); for(int i = 0; i < m; ++i) { if(activ[U[i]] && activ[V[i]]) { L[U[i]].push_back({V[i], i});; } } vi S; vi viz(n, 0); vi Sol; bool ok = false; function<void(int, int)> dfs = [&](int u, int ultm) { if(ok) return; if(viz[u] == 2) return; if(viz[u] == 1) { vi Cyc; Cyc.push_back(S.back()); S.pop_back(); while(!S.empty() && V[S.back()] != u) { Cyc.push_back(S.back()); S.pop_back(); } vi S1 = S; for(auto it : S1) Sol.push_back(it); reverse(Cyc.begin(), Cyc.end()); for(auto it : Cyc) Sol.push_back(it); for(auto it : Cyc) Sol.push_back(it ^ 1); reverse(Cyc.begin(), Cyc.end()); for(auto it : Cyc) Sol.push_back(it); for(auto it : Cyc) Sol.push_back(it ^ 1); reverse(S1.begin(), S1.end()); for(auto it : S1) Sol.push_back(it); ok = 1; return; } viz[u] = 1; for(auto [it, id] : L[u]) { if(id / 2 == ultm / 2) continue; S.push_back(id); dfs(it, id); if(ok) break; if(!S.empty() && S.back() == id) S.pop_back(); } viz[u] = 2; }; dfs(0, -2); if(Sol.empty()) return false; validate(Sol, n, m, U, V); return Sol; }
#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...