이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
const lint inf = 1e18;
// Direction list:
// 0 = positive X
// 1 = positive Y
// 2 = negative X
// 3 = negative Y
int Solve(int N, vector<int> X, vector<int> Y, vector<int> D) {
vector<vector<array<int, 4>>> adj(4, vector<array<int, 4>>(3));
// (D value, Hash X, Hash Y, comparator)
adj[0][0] = {3, 1, -1, 1};
adj[0][1] = {2, 0, 2, 1};
adj[0][2] = {1, 1, 1, 1};
adj[1][0] = {2, 1, -1, 1};
adj[1][1] = {3, 2, 0, 1};
adj[1][2] = {0, 1, 1, 0};
adj[2][0] = {1, 1, -1, 0};
adj[2][1] = {0, 0, 2, 0};
adj[2][2] = {3, 1, 1, 0};
adj[3][0] = {0, 1, -1, 0};
adj[3][1] = {1, 2, 0, 0};
adj[3][2] = {2, 1, 1, 1};
const auto Intersect = [&](int u, int v) {
for (auto ar : adj[D[u]]) {
if (D[v] == ar[0] &&
X[u] * ar[1] + Y[u] * ar[2] == X[v] * ar[1] + Y[v] * ar[2] &&
int(pair(X[u], Y[u]) < pair(X[v], Y[v])) == ar[3]) {
return (abs(X[u] - X[v]) + abs(Y[u] - Y[v])) / 2;
}
}
return -1;
};
vector<lint> dist(N, inf);
dist[0] = 0;
vector<int> done(N);
for (int rep = 0; rep < N; rep++) {
int u = -1;
for (int i = 0; i < N; i++) if (!done[i]) {
if (u == -1 || dist[u] > dist[i]) u = i;
}
if (dist[u] == inf) break;
done[u] = 1;
for (int v = 0; v < N; v++) {
lint t = Intersect(u, v);
if (t >= dist[u]) {
dist[v] = min(dist[v], t);
}
}
}
return N - count(begin(dist), end(dist), inf);
}
vector<int> Direction(int N, vector<int> X, vector<int> Y) {
vector<int> D(N);
D[0] = 0;
for (int i = 1; i < N; i++) {
if (abs(X[i]) == abs(Y[i])) {
if (X[i] > 0 && Y[i] > 0) {
D[i] = 3;
} else if (X[i] > 0 && Y[i] < 0) {
D[i] = 1;
} else {
D[i] = 0;
}
} else {
if (X[i] >= 0 && Y[i] >= 0) {
if (abs(X[i]) > abs(Y[i])) {
D[i] = 2;
} else {
D[i] = 3;
}
} else if (X[i] <= 0 && Y[i] >= 0) {
if (abs(X[i]) > abs(Y[i])) {
D[i] = 0;
} else {
D[i] = 3;
}
} else if (X[i] <= 0 && Y[i] <= 0) {
if (abs(X[i]) > abs(Y[i])) {
D[i] = 0;
} else {
D[i] = 1;
}
} else if (X[i] >= 0 && Y[i] <= 0) {
if (abs(X[i]) > abs(Y[i])) {
D[i] = 2;
} else {
D[i] = 1;
}
}
}
}
return D;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
vector<int> X(N), Y(N);
for (int i = 0; i < N; i++) {
cin >> X[i] >> Y[i];
X[i] *= 2; Y[i] *= 2;
}
for (int i = N - 1; i >= 0; i--) { // Initial person at (0, 0)
X[i] -= X[0];
Y[i] -= Y[0];
}
int ans = 0;
for (int d = 0; d < 4; d++) {
ans = max(ans, Solve(N, X, Y, Direction(N, X, Y)));
for (int i = 0; i < N; i++) {
tie(X[i], Y[i]) = pair(-Y[i], X[i]);
}
}
cout << ans << '\n';
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |