一道思维题

发布时间 2023-09-03 14:46:04作者: 傻阙的缺

题目传送门

考虑从第 \(i\) 个整数 \(a_i\) 满足 \(i-n\le a_i\le i-1\) 入手。

但是这样看起来没有什么性质,所以我们考虑将它变形:\(1\le i-a_i\le n\)

我们发现,如果有 \(a_i+a_j+...+a_k=0\) 就有 \((i-a_i)+(j-a_j)+...+(k-a_k)=i+j+...+k\)

因为有如上的性质,所以必然有一种情况形如: \(i-a_i=j,j-a_j=k,...x-a_x=i\),所以可以进行 \(dfs\)

上代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+50;
ll T,n,a[N],dfn[N],w[N],idx;
void sc(int le,int ri)
{
	printf("%d\n",ri-le+1);
	for(int i=le;i<=ri;i++)
	printf("%d ",w[i]);
	printf("\n");
}
void dfs(int wz)
{
	if(dfn[wz])
	{
		sc(dfn[wz],idx);
		return ;
	}
	dfn[wz]=++idx;
	w[idx]=wz;
	dfs(wz-a[wz]);
}
int main()
{
	scanf("%lld",&T);
	while(T--)
	{
		scanf("%lld",&n);
		for(ll i=1;i<=n;i++)
			scanf("%lld",&a[i]);
		dfs(1);
		idx=0;
		for(int i=1;i<=n;i++)
		dfn[i]=0,w[i]=0;
	}
	return 0;
}