제출 #980282

#제출 시각아이디문제언어결과실행 시간메모리
980282vjudge1가장 긴 여행 (IOI23_longesttrip)C++17
25 / 100
13 ms1112 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(286); const int INF = (int)1e6; bool conectados(int A, int B) { vector<int> a,b; a.push_back(A); b.push_back(B); return are_connected(a,b); } 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) { vector <int> ans; ans.push_back(0); if (conectados(0, 1)) ans.push_back(1); return ans; } void dfs(int nodo, int p, vector <vector<int>> &g, vector <int> &ans) { ans.push_back(nodo); for (auto &it : g[nodo]) { if (it == p) continue; dfs(it, nodo, g, ans); } return; } int bin(int l, int r, vector <int> &ar, vector <int> &bus) { if (l == r) return ar[l]; vector <int> aux; for (int i = l; i <= mid; i++) aux.push_back(ar[i]); if (are_connected(aux, 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() >= 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); } } 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 (VA.size() > VB.size()) return VA; return VB; if (!are_connected(VA,VB)) { if (VA.size() > VB.size()) return VA; return VB; } V[0] = A; V[1] = B; bool c1,c2,c3,c4; c1 = conectados(V[0].lin.front(), V[1].lin.front()); c2 = conectados(V[0].lin.front(), V[1].lin.back()); c3 = conectados(V[0].lin.back(), V[1].lin.back()); 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); 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, -1, g, ans); break; } } } else { for (auto &it : g[ancla2]) { if (it != ancla) { dfs(it, -1, g, ans); break; } } } return ans; }

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

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