并查集模板题。存一下
问你借书多少天能够循环到开始状态
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
typedef long long ll;
int maxn = 100000;
ll mod = 1000000000 + 7;
ll inf = 9223372036854775800L;
int parent[210000], sum[210000];
bool cmp(int a, int b) {
return a < b;
}
int find(const int &x) {
int j, k = x, r = x;
while (parent[r] != r)r = parent[r];
//路径压缩
while (k != r) {
j = parent[k];
parent[k] = r;
k = j;
}
return r;
}
void to_union(int x1, int x2) {
int p1 = find(x1);
int p2 = find(x2);
parent[p2] = p1;
}
int main() {
int n, m;
cin >> n;
while (n--) {
cin >> m;
for (int i = 1; i <= 201000; ++i) {
parent[i] = i;
}
memset(sum, 0, sizeof(sum));
for (int i = 1; i <= m; ++i) {
int a;
cin >> a;
if (a > i) {
to_union(i, a);
} else {
to_union(a, i);
}
}
for (int i = 1; i <= m; ++i) {
int a = find(i);
sum[a]++;
}
for (int i = 1; i <= m; ++i) {
if (i == m) {
cout << sum[parent[i]] << endl;
} else {
cout << sum[parent[i]] << " ";
}
}
}
return 0;
}