疑似过于逆天(?
查看原帖
疑似过于逆天(?
704668
WZWZWZWY楼主2024/12/14 07:32

正常写,写挂了,只有 2020

#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

2024/12/14 07:32
加载中...