题解:CF1787D Game on Axis
TCY1234567 · · 题解
题解
显然从
当点
当点
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int vis[200005],a[200005],can[200005],sz[200005];
vector <int> g[400005];
int n;
void dfs(int p,int fa)
{
if(vis[p]) return;
vis[p] = fa;
if(p+a[p]<1||p+a[p]>n)
{
can[p] = 1;
return;
}
dfs(p+a[p],fa);
can[p] = can[p+a[p]];
return;
}
void dfs2(int p)
{
sz[p] = 1;
for(auto x:g[p])
{
dfs2(x);
sz[p]+=sz[x];
}
return;
}
signed main()
{
int t;
scanf("%lld",&t);
while(t--)
{
int ans = 0;
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
for(int i=1;i<=n;i++)
{
g[i].clear();
vis[i] = sz[i] = can[i] = 0;
}
for(int i=1;i<=n;i++)
{
if(!vis[i]) dfs(i,i);
}
int cnt = 0;
for(int i=1;i<=n;i++)
{
if(can[i]) cnt++;
}
if(can[1])
{
for(int i=1;i<=n;i++)
{
if(i+a[i]<1||i+a[i]>n) continue;
g[i+a[i]].push_back(i);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==1&&(i+a[i]<1||i+a[i]>n)) dfs2(i);
}
for(int i=1;i<=n;i++)
{
if(vis[i]==1)
ans += cnt-sz[i]+n+1;
else
ans += n*2+1;
}
}
else
{
for(int i=1;i<=n;i++)
{
if(vis[i]) ans += (cnt+n+1);
}
}
printf("%lld\n",ans);
}
}