QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#338054 | #4513. Slide Parade | Dualqwq | 0 | 2307ms | 38308kb | C++17 | 2.8kb | 2024-02-25 17:20:25 | 2024-02-25 17:20:25 |
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 = fir[x]) {
fir[x] = 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();
}
}
bool inmth[N];
void work() {
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++) {
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,Euler::addvir(i,mth[i] - n);
for(int i = 1;i <= n;i++) {
Bfs(n + i);
for(int j = 1;j <= ect;j++)
if(!inmth[j] && to[j] == n + i) {
int u = st[j],v = n + i;
if(!vis[u]) return puts("IMPOSSIBLE"),void();
int now = u;
while(now != v) inmth[pe[now]] ^= 1,now = pv[now];
inmth[j] ^= 1;
for(int k = 1;k <= ect;k++)
if(inmth[k]) Euler::addvir(st[k],to[k] - n);
now = u;
while(now != v) inmth[pe[now]] ^= 1,now = pv[now];
inmth[j] ^= 1;
}
}
Euler::Euler(1);
printf("%d\n",(int)Ans.size() + 1);
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;
}
/*
1
3 6
1 2
1 3
2 1
2 3
3 1
3 2
*/
详细
Test #1:
score: 0
Wrong Answer
time: 2ms
memory: 9988kb
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: 31 1 4 2 3 5 1 3 4 2 5 1 4 2 3 5 1 3 4 2 5 1 4 2 3 5 1 4 2 5 3 1 Case #3: 31 1 4 2 3 5 1 4 3 1 4 3 1 4 2 5 2 5 2 3 5 1 4 2 3 5 1 4 5 2 3 1 Case #4: 13 1 2 3 1 2 3 1 2 3 1 3 2 1 Case #5: 31 1 5 2 4 3 1 2 4 5 3 1 2 4 5 3 1 5 2 4 3 1 5 2 4 5 4 3 1 2 3 1 Case #6: 29 1 2 ...
result:
wrong answer L (= 4) is out of range [7, 1000001] (test case 25)
Test #2:
score: 0
Wrong Answer
time: 2307ms
memory: 38308kb
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: 159576 1 71 196 195 167 200 169 196 76 198 193 195 85 196 195 167 108 193 137 196 114 193 137 164 198 184 185 174 195 29 192 128 197 200 31 197 164 123 199 200 169 145 193 109 199 180 197 185 117 196 195 197 164 193 137 196 137 164 123 122 153 187 200...
result:
wrong answer invalid move (from 47 to 47) (test case 3)