QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#346585 | #4513. Slide Parade | orz_z | 35 ✓ | 2916ms | 45304kb | C++14 | 3.0kb | 2024-03-08 18:09:49 | 2024-03-08 18:09:49 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
const int N = 5e2 + 5, M = 4e4 + 5;
int n, m;
int U[M], V[M];
int fir[N], nxt[M], st[M], to[M], ect = 1;
inline void addedge(int u1, int v1) {
nxt[++ect] = fir[u1];
fir[u1] = ect;
to[ect] = v1;
st[ect] = u1;
}
bool vis[N];
int mth[N], mthe[N];
bool dfs(int x) {
for (int i = fir[x], y; y = to[i], i; i = nxt[i])
if (!vis[y]) {
vis[y] = 1;
if (!mth[y] || dfs(mth[y])) {
mth[x] = y;
mth[y] = x;
mthe[x] = i;
return 1;
}
}
return 0;
}
int pv[N], pe[N];
void Bfs(int st) {
queue<int> Q;
for (int i = 1; i <= n + n; i++) vis[i] = pv[i] = pe[i] = 0;
Q.push(st);
vis[st] = true;
while (!Q.empty()) {
int x = Q.front();
Q.pop();
// printf("st,x:%d,%d\n",st,x);
if (x > n) {
int y = mth[x];
if (vis[y]) continue;
pv[y] = x;
pe[y] = mthe[y];
Q.push(y);
vis[y] = true;
} else
for (int i = fir[x], y; y = to[i], i; i = nxt[i])
if (i != mthe[x] && !vis[y]) {
vis[y] = true;
pv[y] = x;
pe[y] = i;
Q.push(y);
}
}
}
vector<int> Ans;
namespace Euler {
const int N = 1e3 + 5, M = 4e6 + 5;
int fir[N], nxt[M], to[M], ect = 1, sgn[M];
inline void addvir(int u1, int v1) {
// printf("vir:%d->%d\n",u1,v1);
nxt[++ect] = fir[u1];
fir[u1] = ect;
to[ect] = v1;
sgn[ect] = 0;
}
void Euler(int x) {
for (int &i = fir[x], y; y = to[i], i; i = nxt[i]) {
if (sgn[i]) continue;
sgn[i] = true;
Euler(y);
}
Ans.push_back(x);
}
void Clr(int n) {
ect = 1;
for (int i = 1; i <= n; i++) fir[i] = 0;
Ans.clear();
}
}
map<pair<int, int>, bool> mp;
bool inmth[M];
void work() {
mp.clear();
cin >> n >> m;
for (int i = 1; i <= m; i++) cin >> U[i] >> V[i];
for (int i = 1; i <= n + n; i++)
pv[i] = pe[i] = mth[i] = vis[i] = mthe[i] = fir[i] = 0;
Euler::Clr(n);
ect = 1;
for (int i = 1; i <= m; i++)
addedge(U[i], V[i] + n);
for (int i = 1; i <= n; i++) if(!mth[i]) {
for (int j = 1; j <= n + n; j++) vis[j] = 0;
if (!dfs(i)) return puts("IMPOSSIBLE"), void();
}
for (int i = 1; i <= ect; i++) inmth[i] = 0;
for (int i = 1; i <= n; i++) inmth[mthe[i]] = true;
for (int i = 1; i <= m; i++) if(!mp[{U[i], V[i]}]) {
int u = U[i], v = V[i] + n;
if (mth[u] != v) {
mth[mth[u]] = 0;
int k = mth[u], k2 = mth[v];
mth[u] = 0, mth[mth[v]] = 0, mth[v] = 0;
for (int j = 1; j <= n + n; j++) vis[j] = 0;
vis[v] = 1, vis[u] = 1;
if (!dfs(k2)) return puts("IMPOSSIBLE"), void();
else mth[u] = v, mth[v] = u;
}
for (int j = 1; j <= n; j++)
Euler::addvir(j, mth[j] - n), mp[{j, mth[j] - n}] = 1;
}
Euler::Euler(1);
if (Ans.size() != Euler::ect) return puts("IMPOSSIBLE"), void();
printf("%d\n", (int)Ans.size());
reverse(Ans.begin(), Ans.end());
// Ans.push_back(1);
for (auto i : Ans) printf("%d ", i);
printf("\n");
}
int main() {
int T;
cin >> T;
for (int _ = 1; _ <= T; _++) {
printf("Case #%d: ", _);
work();
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 11
Accepted
time: 2ms
memory: 8204kb
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: 16 1 4 2 5 3 1 4 2 3 5 1 3 4 2 5 1 Case #3: 16 1 4 2 3 5 1 4 3 1 4 5 2 5 2 3 1 Case #4: 7 1 3 2 1 2 3 1 Case #5: 16 1 2 4 5 3 1 5 2 4 5 4 3 1 2 3 1 Case #6: 17 1 3 4 2 1 4 2 3 1 3 1 2 4 2 4 3 1 Case #7: 11 1 3 5 4 2 1 2 4 5 3 1 Case #8: 16 1 4 3 5 2 1 4 2 4 2 3 5 1...
result:
ok (100 test cases)
Test #2:
score: 24
Accepted
time: 2916ms
memory: 45304kb
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: 145601 1 61 90 57 31 134 34 43 9 136 14 64 47 89 164 129 137 193 7 5 101 86 139 10 151 97 141 100 170 50 79 178 117 158 185 54 60 161 142 194 103 75 6 110 108 153 174 88 15 173 180 197 200 11 152 177 40 166 17 184 104 130 125 102 179 122 1 28 38 52 84...
result:
ok (100 test cases)