Submission #1240874

#TimeUsernameProblemLanguageResultExecution timeMemory
1240874nikulidThousands Islands (IOI22_islands)C++20
17.35 / 100
72 ms13636 KiB
#include "islands.h" #include <map> #include <variant> #include <vector> #include <algorithm> using namespace std; #define pb push_back #define mp make_pair variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V) { vector<int> answer; if(N==2){ // subtask 1 vector<int> A, B; for(int i=0; i<M; i++){ if(U[i]==0 && V[i]==1){ A.pb(i); } else{ B.pb(i); } } if(A.size()>1 && B.size()>0){ answer = {A[0], B[0], A[1], A[0], B[0], A[1]}; return answer; } else{ return false; } } // subtask 3 (21 marks) vector<vector<int>> adj(N); map<pair<int, int>, int> can; int u,v; for(int i=0; i<M; i++){ u=U[i]; v=V[i]; adj[u].pb(v); can[mp(u,v)]=i; } if(adj[0].size() > 1){ // simple case (same as subtask 2) answer = {can[mp(0, adj[0][0])], can[mp(adj[0][0], 0)], can[mp(0, adj[0][1])], can[mp(adj[0][1], 0)], can[mp(adj[0][0], 0)], can[mp(0, adj[0][0])], can[mp(adj[0][1], 0)], can[mp(0, adj[0][1])]}; return answer; } if(adj[0].size() == 0)return false; // complex case int cur = adj[0][0]; int prev = 0; vector<int> beforetrip={ can[mp(prev, cur)] }; vector<int> aftertrip= { can[mp(prev, cur)] }; vector<int> trip; while(true){ if(adj[cur].size()==1){ return false; } else if(adj[cur].size()==2){ if(adj[cur][0]==prev){ prev = cur; cur = adj[cur][1]; } else{ prev = cur; cur = adj[cur][0]; } beforetrip.pb( can[mp(prev,cur)] ); aftertrip.pb( can[mp(prev,cur)] ); } else{ // we have the trip! int A=cur,B,C; // find B,C which are NOT prev if(adj[cur][0]==prev){ B = adj[cur][1]; C = adj[cur][2]; } else if(adj[cur][1]==prev){ B = adj[cur][0]; C = adj[cur][2]; } else{ B = adj[cur][0]; C = adj[cur][1]; } int AB,BA,AC,CA; // find canoes between AB and AC AB = can[mp(A,B)]; BA = can[mp(B,A)]; AC = can[mp(A,C)]; CA = can[mp(C,A)]; trip = {AB,BA,AC,CA,BA,AB,CA,AC}; for(int i=0; i<beforetrip.size(); i++){ answer.pb(beforetrip[i]); } for(int i=0; i<trip.size(); i++){ answer.pb(trip[i]); } for(int i=aftertrip.size()-1; i>-1; i--){ answer.pb(aftertrip[i]); } return answer; } } return false; }
#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...