#include<bits/stdc++.h> usingnamespace std; #define int long long
structDSU { int n; vector<int> p, sz; DSU(int n_) { n = n_; init(n); } voidinit(int n){ p.resize(n + 1); sz.resize(n + 1, 1); iota(p.begin() + 1, p.end(), 1); } intfind(int x){ while (x != p[x]) { x = p[x] = p[p[x]]; } return x; } boolmerge(int x, int y){ x = find(x); y = find(y); if (x == y) { returnfalse; } if (sz[x] > sz[y]) { swap(x, y); } sz[y] += sz[x]; p[x] = y; returntrue; } boolsame(int x, int y){ returnfind(x) == find(y); } intsize(int x){ return sz[find(x)]; } };
voidsolve(){ int n, m; cin >> n >> m; DSU dsu(n); vector<int> out(m + 1), st(m + 1); for (int i = 1; i <= m; i++) { int x, y; cin >> x >> y; if (dsu.same(x, y)) { out[i] = true; st[i] = x; } else { dsu.merge(x, y); } } int cnt = 0; for (int i = 1; i <= n; i++) { if (i == dsu.p[i]) { cnt++; } } cout << cnt - 1 << "\n"; for (int i = 1, k = 1; i <= m; i++) { if (!out[i]) { continue; } while (k <= n && dsu.find(k) == dsu.find(st[i])) { k++; } if (k > n) { break; } dsu.merge(st[i], dsu.find(k)); cout << i << " " << st[i] << " " << k << "\n"; } }
signedmain(){ ios::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } return0; }
#include<bits/stdc++.h> usingnamespace std; #define int long long
structBIT { int n; vector<int> w; BIT(int n) { this->n = n; w.resize(n + 1); } voidadd(int x, int k){ for (; x <= n; x += x & -x) { w[x] += k; } } voidadd(int x, int y, int k){ add(x, k), add(y + 1, -k); } intask(int x){ int ans = 0; for (; x; x -= x & -x) { ans += w[x]; } return ans; } intask(int x, int y){ returnask(y) - ask(x - 1); } intkth(int k){ // 查找第 k 小的值 int ans = 0; for (int i = log2(n); i >= 0; i--) { int val = ans + (1 << i); if (val < n && w[val] < k) { k -= w[val]; ans = val; } } return ans + 1; } };
voidsolve(){ int n; cin >> n; vector<int> p(n + 1); for (int i = 1; i <= n; i++) { cin >> p[i]; } BIT bit(n); for (int i = 1; i <= n; i++) { bit.add(i, 1); } vector<int> ans(n + 1); for (int i = n; i >= 1; i--) { int k = bit.kth(p[i]); ans[k] = i; bit.add(k, -1); } for (int i = 1; i <= n; i++) { cout << ans[i] << " \n"[i == n]; } }
signedmain(){ ios::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while (t--) { solve(); } return0; }