제출 #687660

#제출 시각아이디문제언어결과실행 시간메모리
687660Alcabel철로 (IOI14_rail)C++17
100 / 100
85 ms588 KiB
#include <rail.h> #include <bits/stdc++.h> using namespace std; const int C = 1, D = 2; void findLocation(int n, int first, int location[], int stype[]) { for (int i = 0; i < n; ++i) { location[i] = -1, stype[i] = -1; } location[0] = first, stype[0] = C; vector<int> dFirst(n), dNxt(n); dFirst[0] = 0; for (int i = 1; i < n; ++i) { dFirst[i] = getDistance(0, i); } int nxt = min_element(dFirst.begin() + 1, dFirst.end()) - dFirst.begin(); location[nxt] = location[0] + dFirst[nxt]; stype[nxt] = D; dNxt[0] = dFirst[nxt], dNxt[nxt] = 0; for (int i = 1; i < n; ++i) { if (i != nxt) { dNxt[i] = getDistance(nxt, i); } } vector<int> left, right, x; for (int i = 1; i < n; ++i) { if (i != nxt) { if (dFirst[i] == dNxt[i] + dFirst[nxt]) { left.emplace_back(i); } else { right.emplace_back(i); } } } sort(left.begin(), left.end(), [&](const int& A, const int& B) { return dNxt[A] < dNxt[B]; }); for (const int& y : left) { if (dNxt[y] <= dNxt[0]) { location[y] = location[nxt] - dNxt[y]; stype[y] = C; } else if (!x.empty()) { bool isC = true; int curD = getDistance(y, x.back()); for (const int& owner : x) { if (curD == dNxt[y] - dNxt[owner] + dNxt[x.back()] - dNxt[owner]) { isC = false; location[y] = location[owner] + dNxt[y] - dNxt[owner]; stype[y] = D; break; } } if (isC) { location[y] = location[nxt] - dNxt[y]; stype[y] = C; x.emplace_back(y); } } else { location[y] = location[nxt] - dNxt[y]; stype[y] = C; x.emplace_back(y); } } sort(right.begin(), right.end(), [&](const int& A, const int& B) { return dFirst[A] < dFirst[B]; }); x.clear(); for (const int& y : right) { assert(location[y] == -1); if (!x.empty()) { bool isD = true; int curD = getDistance(y, x.back()); for (const int& owner : x) { if (curD == dFirst[y] - dFirst[owner] + dFirst[x.back()] - dFirst[owner]) { isD = false; location[y] = location[owner] - (dFirst[y] - dFirst[owner]); stype[y] = C; break; } } if (isD) { location[y] = location[0] + dFirst[y]; stype[y] = D; x.emplace_back(y); } } else { location[y] = location[0] + dFirst[y]; stype[y] = D; x.emplace_back(y); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...