首先考虑尽可能的满足想换座位的人
我们将想换座位的人单独记录下来,然后将其循环打乱,就是给第一个人最后一个人的座位,第二个人第一个人的座位,以此类推
发现很像第一天的最后一题,我们维护一个map给每个需要换座位的人自己到自己的映射,然后将其错位swap即可,实现非常的简单
#include <bits/stdc++.h> using namespace std; #define int long long const int N = 2e5 + 5; int __t = 1, n; string s; void solve() { cin >> n >> s; map<int, int> mp; for (int i = 1; i <= n; i++) if (s[i - 1] == '1') mp[i] = i; int ov = mp.rbegin()->second; for (auto& [k, v] : mp) swap(v, ov); for (int i = 1; i <= n; i++) cout << (mp[i] ? mp[i] : i) << " \n"[i == n]; return; } int32_t main() { #ifdef ONLINE_JUDGE ios::sync_with_stdio(false); cin.tie(0); #endif // cin >> __t; while (__t--) solve(); return 0; }