제출 #387386

#제출 시각아이디문제언어결과실행 시간메모리
387386rama_pangIOI 바이러스 (JOI21_fever)C++17
37 / 100
5074 ms6212 KiB
#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 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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...