QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#346572#4513. Slide Paradeorz_z0 95ms7976kbC++143.0kb2024-03-08 18:04:292024-03-08 18:04:29

Judging History

你现在查看的是最新测评结果

  • [2024-03-08 18:04:29]
  • 评测
  • 测评结果:0
  • 用时:95ms
  • 内存:7976kb
  • [2024-03-08 18:04:29]
  • 提交

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) {
	if(mth[x]) return 1;
	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];
			mth[u] = 0;
			for (int j = 1; j <= n + n; j++) vis[j] = 0;
			vis[v] = 1, vis[u] = 1;
			if (!dfs(mth[v]) || !dfs(k)) 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;
}

详细

Test #1:

score: 0
Wrong Answer
time: 2ms
memory: 7960kb

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: IMPOSSIBLE
Case #3: IMPOSSIBLE
Case #4: IMPOSSIBLE
Case #5: IMPOSSIBLE
Case #6: IMPOSSIBLE
Case #7: IMPOSSIBLE
Case #8: IMPOSSIBLE
Case #9: IMPOSSIBLE
Case #10: IMPOSSIBLE
Case #11: IMPOSSIBLE
Case #12: IMPOSSIBLE
Case #13: IMPOSSIBLE
Case #14: IMPOSSIBLE
Case #15: IMPOS...

result:

wrong answer you didn't find a solution but jury did (test case 2)

Test #2:

score: 0
Wrong Answer
time: 95ms
memory: 7976kb

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: IMPOSSIBLE
Case #4: IMPOSSIBLE
Case #5: IMPOSSIBLE
Case #6: IMPOSSIBLE
Case #7: IMPOSSIBLE
Case #8: IMPOSSIBLE
Case #9: IMPOSSIBLE
Case #10: IMPOSSIBLE
Case #11: IMPOSSIBLE
Case #12: IMPOSSIBLE
Case #13: IMPOSSIBLE
Case #14: IMPOSSIBLE
Case #15: IMPOS...

result:

wrong answer you didn't find a solution but jury did (test case 3)