QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#638924#8212. Football in OsijekDjangle162857#WA 0ms3824kbC++233.0kb2024-10-13 17:20:362024-10-13 17:20:36

Judging History

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

  • [2024-10-13 17:20:36]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3824kb
  • [2024-10-13 17:20:36]
  • 提交

answer

#define LOCAL
#include <bits/stdc++.h>
#define fir first
#define sec second
#define el '\n'

#ifdef LOCAL
#define FINISH cerr << "FINISH" << endl;
#else
#define FINISH ;
#endif

#ifdef LOCAL
#define debug(x) cerr << setw(4) << #x << " == " << x << endl
#else
#define debug(x)
#endif

#ifdef LOCAL
#define debugv(x)                   \
	cerr << setw(4) << #x << ":: "; \
	for (auto i : x)                \
		cerr << i << " ";           \
	cerr << endl
#else
#define debugv(x)
#endif

using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
ostream& operator<<(ostream& out, PII& x)
{
	out << x.fir << " " << x.sec << endl;
	return out;
}

const int mod = 998244353;
const int inf = 0x3f3f3f3f;
const int N = 200020;
void solve()
{
	int n;
	cin >> n;
	vector<int> a(n + 1, 0);
	vector<int> inp(n + 1, 0);
	vector<int> col(n + 1, 0);
	vector<int> ans(n + 1, inf);
	vector<int> dep(n + 1, 0);
	vector<int> siz(1, 0);
	vector<vector<int>> edge(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		edge[i].push_back(a[i]);
		inp[a[i]]++;
	}
	vector<int> v;
	for (int i = 1; i <= n; i++) {
		if (inp[i] == 0)
			v.push_back(i);
	}
	int cnt = 0;
	auto dfs = [&](auto& self, int x) {
		cnt++;
		int tot = 0;
		vector<int> res;
		while (col[x] == 0) {
			col[x] = cnt;
			res.push_back(x);
			x = a[x];
		}
		if (col[x] == cnt) {  // 找到环
			for (int i = res.size() - 1; i >= 0; i--) {
				dep[res[i]] = 0;
				if (res[i] == x) {
					for (int j = i - 1; j >= 0; j--) {
						dep[res[j]] = dep[res[j + 1]] + 1;
					}
					break;
				}
			}
		}
		else {
			dep[res[res.size() - 1]] = dep[x] + 1;
			for (int i = res.size() - 2; i >= 0; i--) {
				dep[res[i]] = dep[res[i + 1]] + 1;
			}
		}
	};
	for (int i = 1; i <= n; i++) {
		if (inp[i] == 0) {
			dfs(dfs, i);
			ans[dep[i]] = 0;
		}
	}
	for (int i = 1; i <= n; i++) {
		if (col[i] == 0) {
			cnt++;
			int x = i;
			int tot = 0;
			while (col[x] == 0) {
				col[x] = cnt;
				x = a[x];
				tot++;
			}
			ans[tot] = 0;
			siz.push_back(tot);
		}
	}
	sort(v.begin(), v.end(), [&](int x, int y) { return dep[x] > dep[y]; });
	int ct = 0;
	vector<int> vis(n + 1, 0);
	for (int i = 0; i < v.size(); i++) {
		int x = v[i];
		int tot = 0;
		vector<int> r;
		while (vis[x] == 0) {
			vis[x] = cnt;
			r.push_back(x);
			x = a[x];
			tot++;
		}
		siz.push_back(tot);
		for (int i = 0; i < r.size(); i++) {
			ans[tot] = 0;
			tot--;
			if (r[i] == x)
				break;
		}
	}
	sort(next(siz.begin()), siz.end());
	vector<int> nans(n + 1, 0);
	for (int i = 1; i < siz.size(); i++) {
		siz[i] += siz[i - 1];
		nans[siz[i]] = 1;
	}
	for (int i = 1; i <= n; i++) {
		nans[i] += nans[i - 1];
	}
	for (int i = 1; i <= n; i++) {
		cout << min(nans[i], ans[i]) << " ";
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	int T = 1;
	// cin >> T;
	while (T--) {
		solve();
	}
	return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 0
Wrong Answer
time: 0ms
memory: 3824kb

input:

5
2 3 1 3 5

output:

0 1 0 0 2 

result:

wrong answer 5th numbers differ - expected: '1', found: '2'