| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 842336 | SHZhang | 가장 긴 여행 (IOI23_longesttrip) | C++17 | 13 ms | 940 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "longesttrip.h"
#include <cstdio>
#include <vector>
#include <algorithm>
#include <utility>
using namespace std;
vector<int> longest_trip(int N, int D)
{
vector<int> c1, c2;
c1.push_back(0);
for (int i = 1; i < N; i++) {
if (c2.empty()) {
if (are_connected({c1.back()}, {i})) {
c1.push_back(i);
} else {
c2.push_back(i);
}
} else {
bool conn1 = are_connected({c1.back()}, {i});
bool conn2 = are_connected({c2.back()}, {i});
if (conn1 && conn2) {
reverse(c2.begin(), c2.end());
c1.push_back(i);
for (int i = 0; i < c2.size(); i++) {
c1.push_back(c2[i]);
}
c2.clear();
} else if (conn1) {
c1.push_back(i);
} else {
c2.push_back(i);
}
}
}
if (c2.empty()) {
return c1;
}
if (!are_connected(c1, c2)) {
if (c1.size() > c2.size()) {
return c1;
} else {
return c2;
}
}
if (c1.size() >= 2 && !are_connected({c1.front()}, {c1.back()})) {
if (are_connected({c1.front()}, {c2.front()})) {
reverse(c1.begin(), c1.end());
}
for (int i = 0; i < c2.size(); i++) {
c1.push_back(c2[i]);
}
return c1;
}
if (c2.size() >= 2 && !are_connected({c2.front()}, {c2.back()})) {
if (are_connected({c1.back()}, {c2.back()})) {
reverse(c2.begin(), c2.end());
}
for (int i = 0; i < c2.size(); i++) {
c1.push_back(c2[i]);
}
return c1;
}
int l1 = 1;
int r1 = c1.size();
while (l1 < r1) {
int mid = (l1 + r1) / 2;
vector<int> newc1;
for (int i = 0; i < mid; i++) newc1.push_back(c1[i]);
if (are_connected(newc1, c2)) {
r1 = mid;
} else {
l1 = mid + 1;
}
}
vector<int> c1pref;
for (int i = 0; i < l1; i++) c1pref.push_back(c1[i]);
int l2 = 1;
int r2 = c2.size();
while (l2 < r2) {
int mid = (l2 + r2) / 2;
vector<int> newc2;
for (int i = 0; i < mid; i++) newc2.push_back(c2[i]);
if (are_connected(c1pref, newc2)) {
r2 = mid;
} else {
l2 = mid + 1;
}
}
vector<int> ans;
for (int i = l1; i < c1.size(); i++) ans.push_back(c1[i]);
for (int i = 0; i < l1; i++) ans.push_back(c1[i]);
for (int i = l2 - 1; i < c2.size(); i++) ans.push_back(c2[i]);
for (int i = 0; i < l2 - 1; i++) ans.push_back(c2[i]);
return ans;
}
컴파일 시 표준 에러 (stderr) 메시지
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
| # | 결과 | 실행 시간 | 메모리 | 채점기 출력 |
|---|---|---|---|---|
| 결과를 불러오는 중입니다… | ||||
