QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#84743 | #4513. Slide Parade | wangzhe_0477 | 0 | 14643ms | 78028kb | C++23 | 2.2kb | 2023-03-06 18:12:46 | 2023-03-06 18:12:49 |
Judging History
answer
// Google Code Jam 2022 World Finals
// Problem C. Slide Parade
#include <bits/stdc++.h>
using LL = long long;
using ULL = unsigned LL;
constexpr ULL E(long double x, int y) {
while (y--) x *= 10;
return x;
}
constexpr ULL SIZE(long double x, int y) {return E(x, y) + 5;}
const int inf32 = E(1, 9) + 5;
const LL inf64 = E(1, 18) + 5;
bool vis[205];
int n, m, mat[205];
std::pair<int, int> edge[5005];
std::unordered_set<int> graph[205];
std::unordered_multiset<int> _graph[205];
std::vector<int> ans;
bool Hungarian(int u) {
if (vis[u]) return false;
vis[u] = true;
for (int v : graph[u]) {
if (mat[v] && !Hungarian(mat[v])) continue;
mat[v] = u;
return true;
}
return false;
}
bool Dfs(int u, int s) {
if (vis[u]) return false;
vis[u] = true;
if (mat[u] == s) return true;
int w = mat[u];
for (int v : graph[w]) {
if (!Dfs(v, s)) continue;
mat[v] = w;
mat[u] = s;
return true;
}
return false;
}
void Euler(int u) {
ans.push_back(u);
if (_graph[u].empty()) return;
int v = *_graph[u].begin();
_graph[u].erase(_graph[u].find(v));
Euler(v);
}
void Solve(int data) {
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
mat[i] = 0;
graph[i].clear();
_graph[i].clear();
}
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d%d", &x, &y);
edge[i] = {x, y};
graph[x].insert(y);
}
int cnt = 0;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) vis[j] = false;
cnt += Hungarian(i);
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) vis[j] = false;
if (!Dfs(edge[i].second, edge[i].first)) {
printf("Case #%d: IMPOSSIBLE\n", data);
return;
}
for (int j = 1; j <= n; j++) _graph[mat[j]].insert(j);
}
ans.clear();
Euler(1);
printf("Case #%d: %llu\n", data, ans.size());
for (int x : ans) printf("%d ", x);
putchar('\n');
}
int main() {
int data_count;
scanf("%d", &data_count);
for (int data = 1; data <= data_count; data++) Solve(data);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 3ms
memory: 3600kb
input:
100 5 8 1 2 1 3 1 4 1 5 2 1 3 1 4 1 5 1 5 10 1 3 1 4 2 3 2 5 3 1 3 4 3 5 4 2 5 1 5 3 5 10 1 4 2 3 2 5 3 1 3 5 4 2 4 3 4 5 5 1 5 2 3 6 1 2 1 3 2 1 2 3 3 1 3 2 5 10 1 2 1 5 2 3 2 4 3 1 4 3 4 5 5 2 5 3 5 4 4 10 1 2 1 3 1 4 2 1 2 3 2 4 3 1 3 4 4 2 4 3 5 10 1 2 1 3 2 1 2 4 3 1 3 5 4 2 4 5 5 3 5 4 5 10 1 ...
output:
Case #1: IMPOSSIBLE Case #2: 51 1 4 2 3 1 4 2 3 1 4 2 3 5 3 5 3 5 1 4 2 3 5 1 4 2 3 5 1 4 2 5 1 4 2 5 1 3 4 2 5 1 3 4 2 5 1 3 4 2 5 1 Case #3: 51 1 4 2 5 1 4 2 5 1 4 2 5 1 4 3 5 2 3 5 2 3 5 2 3 1 4 3 1 4 3 1 4 5 2 3 1 4 5 2 3 1 4 5 2 3 1 4 5 2 3 1 Case #4: 19 1 3 2 1 3 2 1 3 2 1 2 3 1 2 3 1 2 3 1 ...
result:
wrong answer the slide from 5 to 4 hasn't be used (test case 5)
Test #2:
score: 0
Wrong Answer
time: 14643ms
memory: 78028kb
input:
100 199 4980 1 95 1 96 1 105 1 124 1 130 1 131 1 135 1 137 1 139 1 140 1 141 1 147 1 155 1 172 1 174 1 179 1 183 1 188 1 193 1 196 1 197 2 3 2 5 2 13 2 14 2 17 2 20 2 24 2 26 2 30 2 41 2 44 2 45 2 52 2 56 2 67 2 70 2 71 2 74 2 78 2 84 2 85 2 90 2 92 2 93 2 97 2 107 2 111 2 113 2 122 2 124 2 128 2 13...
output:
Case #1: IMPOSSIBLE Case #2: IMPOSSIBLE Case #3: 999425 1 18 83 102 155 192 144 150 159 78 37 198 193 137 196 195 188 165 167 197 185 117 196 2 160 185 91 53 69 49 129 187 200 103 114 193 3 126 153 187 141 4 105 193 11 71 10 61 146 192 26 199 180 197 184 176 124 163 173 188 5 166 193 11 71 10 61 146...
result:
wrong answer the slide from 6 to 120 hasn't be used (test case 3)