思路:
dfs寻找所有的环的平均值。
#include<cstdio>
#include<iostream>
#include<cstring>
#define ll long long
using namespace std;
double a[100010];
int vis[100010];
double sum[100010];
int cnt = 0,flag = 0;
double ans = 0;
void dfs(int x)
{
if(vis[x]==0 && flag==0)
{
vis[x]=1;
dfs(a[x]);
}
else
{
if(vis[x]==2)
{
flag = -1;
cnt--;
return;
}
flag = x;
ans++;
sum[cnt]+=a[x];
vis[x]=2;
return;
}
if(flag>0)
{
vis[x]=2;
if(flag==x)
{
sum[cnt]/=ans;
flag = -1;
return;
}
else
{
ans++;
sum[cnt]+=a[x];
}
}
else
{
vis[x]=2;
return;
}
}
int main()
{
int t;
cin>>t;
while(t--)
{
cnt = 0;
memset(vis,0,sizeof(vis));
memset(sum,0,sizeof(sum));
memset(a,0,sizeof(a));
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
scanf("%lf",&a[i]);
}
for(int i = 1; i <= n; i++)
{
ans = flag = 0;
if(!vis[i])
{
cnt++;
dfs(i);
}
}
int f = 0;
for(int i = 2; i <= cnt; i++)
{
if(sum[i] != sum[i-1])
{
f=1;
break;
}
}
f?printf("NO\n"):printf("YES\n");
}
}