题解:CF1270G Subset with Zero Sum

题意:很简单了不再赘述。

做法:

\(i-n\le a_i \le i-1\) 这个式子长得太难看了,我们考虑直接把 \(i\) 有关的式子挪在一起,再整理一下,变成 \(1\le i-a_i\le n\),然后我们注意到 \(1\le i \le n\),所以我们考虑 \(i\rightarrow i-a_i\),那么这样会连出一个基环树,我们直接拉出来一个环就行了,显然是对的。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 5;
int p[maxn], n;
bool vis[maxn];
void dfs(int u) {
	vis[u] = 1;
	if(vis[p[u]]) {
		int pos = p[u];
		vector<int> v;
		while(pos != u) {
			v.push_back(pos);
			pos = p[pos];
		}
		v.push_back(u);
		cout << v.size() << '\n';
		for (int i = 0; i < v.size(); i++)
			cout << v[i] << " ";
		cout << '\n';
		return ;
	}
	if(!vis[p[u]])
		dfs(p[u]);
}
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> p[i], p[i] = i - p[i], vis[i] = 0;
	dfs(1);
}
signed main() {
	ios::sync_with_stdio(false);
	int T; cin >> T;
	while(T--)
		solve();	
	return 0;
}
posted @ 2025-07-30 14:13  LUlululu1616  阅读(18)  评论(0)    收藏  举报