题解: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;
}

浙公网安备 33010602011771号