正常写,写挂了,只有 20 分。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int dfn[N], low[N], sta[N], c[N], belong[N];
bool vis[N];
vector <int> scc[N], e[N], e2[N];
int _dfn, top, cnt;
int a[N];
void tarjan(int u) {
dfn[u] = low[u] = ++ _dfn;
vis[u] = 1;
sta[++top] = u;
for (auto v : e[u]) {
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if (vis[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
cnt ++;
int v;
belong[u] = cnt;
do {
belong[v] = cnt;
v = sta[top --];
vis[v] = 0;
c[v] = cnt;
scc[cnt].push_back(v);
} while (v != u);
}
}
int main() {
//cin.tie(0); ios::sync_with_stdio(0);
int n, m; cin >> n >> m;
while (m--) {
int i, a, j, b; cin >> i >> a >> j >> b;
e[i + n * (a & 1)].push_back(j + n * (b ^ 1));
e[j + n * (b & 1)].push_back(i + n * (a ^ 1));
}
for (int i = 1; i <= n * 2; i++)
if (!dfn[i]) tarjan(i);
// cout << "POSSIBLE\n";
// cout << "1 0 0 0 1 1 1 0 1 1";
// exit(0);
for (int i = 1; i <= n; i++)
if (belong[i] == belong[i + n]) {
//cout << i;
cout << "IMPOSSIBLE\n";
return 0;
}
cout << "POSSIBLE\n";
for (int i = 1; i <= n; i++)
cout << (belong[i] < belong[i + n]) << " ";
}
然后我下载了数据点 #1。
P4782_1.in:
10 10
3 0 2 0
10 1 9 0
2 1 4 0
10 1 2 1
2 1 2 0
10 1 9 1
2 1 4 0
10 0 9 1
1 1 8 1
8 0 2 1
P4782_1.out:
POSSIBLE
我的代码输出是POSSIBLE+一个看起来正确的构造(1 0 0 0 1 1 1 0 1 1),然而这个数据点的错误信息是:
Wrong Answer.wrong answer The Possibility is wrong: expected = POSSIBLE, found = IMPOSSIBLE
我看了半天题解也没看出哪里有问题。想着套一下其他数据,于是在该输出 IMPOSSIBLE 的地方输出了 i。
#include <bits/stdc++.h>
using namespace std;
const int N = 2e6 + 5;
int dfn[N], low[N], sta[N], c[N], belong[N];
bool vis[N];
vector <int> scc[N], e[N], e2[N];
int _dfn, top, cnt;
int a[N];
void tarjan(int u) {
dfn[u] = low[u] = ++ _dfn;
vis[u] = 1;
sta[++top] = u;
for (auto v : e[u]) {
if (!dfn[v]) {
tarjan(v);
low[u] = min(low[u], low[v]);
} else if (vis[v]) low[u] = min(low[u], dfn[v]);
}
if (low[u] == dfn[u]) {
cnt ++;
int v;
belong[u] = cnt;
do {
belong[v] = cnt;
v = sta[top --];
vis[v] = 0;
c[v] = cnt;
scc[cnt].push_back(v);
} while (v != u);
}
}
int main() {
//cin.tie(0); ios::sync_with_stdio(0);
int n, m; cin >> n >> m;
while (m--) {
int i, a, j, b; cin >> i >> a >> j >> b;
e[i + n * (a & 1)].push_back(j + n * (b ^ 1));
e[j + n * (b & 1)].push_back(i + n * (a ^ 1));
}
for (int i = 1; i <= n * 2; i++)
if (!dfn[i]) tarjan(i);
// cout << "POSSIBLE\n";
// cout << "1 0 0 0 1 1 1 0 1 1";
// exit(0);
for (int i = 1; i <= n; i++)
if (belong[i] == belong[i + n]) {
cout << i;
//cout << "IMPOSSIBLE\n";
return 0;
}
cout << "POSSIBLE\n";
for (int i = 1; i <= n; i++)
cout << (belong[i] < belong[i + n]) << " ";
}
然后……拿了 80 分。
。。。。
这河狸吗??
qwq