제출 #980380

#제출 시각아이디문제언어결과실행 시간메모리
980380vjudge1가장 긴 여행 (IOI23_longesttrip)C++17
85 / 100
20 ms1196 KiB
#include "longesttrip.h" #include <bits/stdc++.h> #include <vector> #define MP make_pair #define f first #define s second #define mid ((l+r)>>1) typedef long long ll; using namespace std; mt19937_64 rnd(chrono::steady_clock::now().time_since_epoch().count()); const int INF = (int)1e6; vector <int> auxa,auxb; bool conectados(int A, int B) { auxa.clear(); auxb.clear(); auxa.push_back(A); auxb.push_back(B); return are_connected(auxa,auxb); } struct linea{ deque <int> lin; linea(){} linea(int A) { lin.push_front(A); } void unir(linea &B, int NB, int NA) { if (NA == lin.front() && NB == B.lin.front()) { while (!B.lin.empty()) { lin.push_front(B.lin.front()); B.lin.pop_front(); } return; } if (NA == lin.front() && NB == B.lin.back()) { while (!B.lin.empty()) { lin.push_front(B.lin.back()); B.lin.pop_back(); } return; } if (NA == lin.back() && NB == B.lin.front()) { while (!B.lin.empty()) { lin.push_back(B.lin.front()); B.lin.pop_front(); } return; } if (NA == lin.back() && NB == B.lin.back()) { while (!B.lin.empty()) { lin.push_back(B.lin.back()); B.lin.pop_back(); } return; } return; } }; vector <int> caso_base(int N) { auxa.clear(); auxa.push_back(0); if (conectados(0, 1)) auxa.push_back(1); return auxa; } void dfs(int nodo, vector <bool> &vis, vector <vector<int>> &g, vector <int> &ans, int anc1, int anc2) { ans.push_back(nodo); if (ans.size() > 1) { anc1 = -1; anc2 = -1; } vis[nodo] = true; for (auto &it : g[nodo]) { if (vis[it] || it == anc1 || it == anc2) continue; dfs(it, vis, g, ans, anc1, anc2); } return; } int bin(int l, int r, vector <int> &ar, vector <int> &bus) { if (l == r) return ar[l]; auxa.clear(); for (int i = l; i <= mid; i++) auxa.push_back(ar[i]); if (are_connected(auxa, bus)) return bin(l, mid, ar, bus); else return bin(mid + 1, r, ar, bus); } std::vector<int> longest_trip(int N, int D) { if (N <= 2) return caso_base(N); vector <linea> V; vector <int> ans; for (int i = 0; i < N; i++) V.push_back(linea(i)); /* shuffle(V.begin(), V.end(), rnd); while (V.size() >= 5) { linea A = V.back(); V.pop_back(); linea B = V.back(); V.pop_back(); linea C = V.back(); V.pop_back(); linea D = V.back(); V.pop_back(); linea E = V.back(); V.pop_back(); if (conectados(A.lin.front(), B.lin.front())) { A.unir(B, B.lin.front(), A.lin.front()); V.push_back(A); V.push_back(C); V.push_back(D); V.push_back(E); shuffle(V.begin(), V.end(), rnd); continue; } if (conectados(C.lin.front(), D.lin.front())) { C.unir(D, D.lin.front(), C.lin.front()); if (conectados(E.lin.front(), A.lin.front())) { E.unir(A, A.lin.front(), E.lin.front()); V.push_back(B); } else { E.unir(B, B.lin.front(), E.lin.front()); V.push_back(A); } V.push_back(E); V.push_back(C); shuffle(V.begin(), V.end(), rnd); continue; } if (conectados(A.lin.front(), C.lin.front()) && conectados(B.lin.front(), D.lin.front())) { A.unir(C, C.lin.front(), A.lin.front()); B.unir(D, D.lin.front(), B.lin.front()); V.push_back(A); V.push_back(B); shuffle(V.begin(), V.end(), rnd); continue; } else { A.unir(D, D.lin.front(), A.lin.front()); B.unir(C, C.lin.front(), B.lin.front()); V.push_back(A); V.push_back(B); shuffle(V.begin(), V.end(), rnd); continue; } } */ shuffle(V.begin(), V.end(), rnd); while (V.size() >= 3) { linea A = V.back(); V.pop_back(); linea B = V.back(); V.pop_back(); linea C = V.back(); V.pop_back(); if (conectados(A.lin.front(), B.lin.front())) { A.unir(B, B.lin.front(), A.lin.front()); V.push_back(A); V.push_back(C); } else if (conectados(A.lin.front(), C.lin.front())) { A.unir(C, C.lin.front(), A.lin.front()); V.push_back(A); V.push_back(B); } else { B.unir(C, C.lin.front(), B.lin.front()); V.push_back(B); V.push_back(A); } shuffle(V.begin(), V.end(), rnd); } linea A = V[0], B = V[1]; vector <int> VA, VB; while (!V[1].lin.empty()) { VB.push_back(V[1].lin.front()); V[1].lin.pop_front(); } while (!V[0].lin.empty()) { VA.push_back(V[0].lin.front()); V[0].lin.pop_front(); } if (!are_connected(VA,VB)) { if (VA.size() > VB.size()) return VA; return VB; } V[0] = A; V[1] = B; bool c1 = false, c2 = false, c3 = false, c4 = false; c1 = conectados(V[0].lin.front(), V[1].lin.front()); if (!c1) c2 = conectados(V[0].lin.front(), V[1].lin.back()); if (!c1 && !c2) c3 = conectados(V[0].lin.back(), V[1].lin.back()); if (!c1 && !c2 && !c3) c4 = conectados(V[0].lin.back(), V[1].lin.front()); if (c1 || c2 || c3 || c4) { if (c1) V[1].unir(V[0], V[0].lin.front(), V[1].lin.front()); else if (c2) V[1].unir(V[0], V[0].lin.front(), V[1].lin.back()); else if (c3) V[1].unir(V[0], V[0].lin.back(), V[1].lin.back()); else if (c4) V[1].unir(V[0], V[0].lin.back(), V[1].lin.front()); while (!V[1].lin.empty()) { ans.push_back(V[1].lin.front()); V[1].lin.pop_front(); } return ans; } int ancla = bin(0, VA.size() - 1, VA, VB); vector <int> vancla; vancla.push_back(ancla); int ancla2 = bin(0, VB.size() - 1, VB, vancla); vector <vector<int>> g(N + 2); vector <bool> vis(N + 2); for (int i = 0; i < N + 2; i++) vis[i] = false; for (int i = 0; i < VA.size() - 1; i++) { g[VA[i]].push_back(VA[i + 1]); g[VA[i + 1]].push_back(VA[i]); } for (int i = 0; i < VB.size() - 1; i++) { g[VB[i]].push_back(VB[i + 1]); g[VB[i + 1]].push_back(VB[i]); } g[VA[VA.size() - 1]].push_back(VA[0]); g[VA[0]].push_back(VA[VA.size() - 1]); g[VB[VB.size() - 1]].push_back(VB[0]); g[VB[0]].push_back(VB[VB.size() - 1]); g[ancla].push_back(ancla2); g[ancla2].push_back(ancla); if (VA.size() != 1) { for (auto &it : g[ancla]) { if (it != ancla2) { dfs(it, vis, g, ans, ancla, ancla2); break; } } } else { for (auto &it : g[ancla2]) { if (it != ancla) { dfs(it, vis, g, ans, ancla, ancla2); break; } } } return ans; }

컴파일 시 표준 에러 (stderr) 메시지

longesttrip.cpp: In function 'std::vector<int> longest_trip(int, int)':
longesttrip.cpp:230:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  230 |     for (int i = 0; i < VA.size() - 1; i++) {
      |                     ~~^~~~~~~~~~~~~~~
longesttrip.cpp:234:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  234 |     for (int i = 0; i < VB.size() - 1; 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...
#Verdict Execution timeMemoryGrader output
Fetching results...