제출 #850297

#제출 시각아이디문제언어결과실행 시간메모리
850297nvmdava가장 긴 여행 (IOI23_longesttrip)C++17
15 / 100
10 ms800 KiB
#include "longesttrip.h" #include <bits/stdc++.h> using namespace std; mt19937_64 rnggen(chrono::steady_clock::now().time_since_epoch().count()); vector<int> rng(vector<int>& a, int l, int r) { vector<int> res; for(int i = l; i <= r; ++i) res.push_back(a[i]); return res; } map<pair<int, int>, int> chk; int get(int a, int b) { if(chk.count({a, b})) return chk[{a, b}]; int w = are_connected({a}, {b}); chk[{a, b}] = w; chk[{b, a}] = w; return w; } std::vector<int> longest_trip(int N, int D) { if(D == 3) { vector<int> res(N); for(int i = 0; i < N; ++i) res[i] = i; return res; } if(D == 2) { vector<int> res = {0}; for(int i = 1; i < N; ++i) { if(are_connected({res.back()}, {i})) { res.push_back(i); continue; } if(i == 1) { res.push_back(i + 1); res.push_back(i); i++; continue; } res.insert(res.begin(), i); } return res; } chk.clear(); vector<vector<int> > all; for(int i = 0; i < N; ++i) { all.push_back({i}); } shuffle(all.begin(), all.end(), rnggen); bool la = 0; while(all.size() >= 3) { int sz = all.size(); if(la == 0) { if(get(all[sz - 1].back(), all[sz - 2].back())) { reverse(all[sz - 2].begin(), all[sz - 2].end()); for(auto x : all[sz - 2]) all[sz - 1].push_back(x); swap(all[sz - 1], all[sz - 2]); all.pop_back(); la = 0; continue; } la = 1; } if(get(all[sz - 1].back(), all[sz - 3].back())) { reverse(all[sz - 3].begin(), all[sz - 3].end()); for(auto x : all[sz - 3]) all[sz - 1].push_back(x); swap(all[sz - 3], all[sz - 2]); swap(all[sz - 2], all[sz - 1]); all.pop_back(); la = 0; continue; } reverse(all[sz - 3].begin(), all[sz - 3].end()); for(auto x : all[sz - 3]) all[sz - 2].push_back(x); swap(all[sz - 3], all[sz - 2]); swap(all[sz - 2], all[sz - 1]); all.pop_back(); la = 0; } int l0 = 0, r0 = (int)all[0].size() - 1; int l1 = 0, r1 = (int)all[1].size() - 1; // for(auto& x : all[0]) cout<<x<<' '; // cout<<'\n'; // for(auto& x : all[1]) cout<<x<<' '; // cout<<'\n'; if(are_connected(rng(all[0], l0, r0), rng(all[1], l1, r1)) == 0) { if(all[0].size() > all[1].size()) return all[0]; return all[1]; } while(l0 != r0 || l1 != r1) { if(l0 != r0) { int m = (l0 + r0) >> 1; if(are_connected(rng(all[0], l0, m), rng(all[1], l1, r1))) { r0 = m; } else { l0 = m + 1; reverse(all[0].begin(), all[0].end()); l0 = all[0].size() - l0 - 1; r0 = all[0].size() - r0 - 1; swap(l0, r0); } continue; } int m = (l1 + r1) >> 1; if(are_connected(rng(all[0], l0, r0), rng(all[1], l1, m))) { r1 = m; } else { l1 = m + 1; reverse(all[1].begin(), all[1].end()); l1 = all[1].size() - l1 - 1; r1 = all[1].size() - r1 - 1; swap(l1, r1); } } vector<int> res; for(int i = 1; i <= all[1].size(); ++i) { res.push_back(all[1][(-i + l1 + all[1].size()) % all[1].size()]); } for(int i = 0; i < all[0].size(); ++i) { res.push_back(all[0][(i + l0) % all[0].size()]); } return res; }

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

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