//i:5 1670 2011 1560 1232 1447 //o:1 //i:6 1556 1449 1863 2014 1333 1220 //o:2 #include <bits/stdc++.h> using namespace std; int n; pair<int, int> tab[3000]; bool odw[3000]; int cdfs(int i){ odw[i] = true; if(!odw[tab[i].second]) return cdfs(tab[i].second) + 1; else return 1; } int cres = 0; vector<vector<pair<int, int>>> res; int t[3000]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; i++){ cin >> tab[i].first; tab[i].second = i; } sort(tab, tab + n); for(int i = 0; i < n; i++) t[tab[i].second] = i; while(true){ bool p = true; for(int i = 0; i < n; ++i) if(t[i] != i) p = false; if(p) break; fill(odw, odw + n, 0); vector<pair<int, int>> r; for(int j = 0; j < n; j++){ if(t[j] == j || odw[j] || odw[t[j]]) continue; r.emplace_back(j+1, t[j]+1); odw[j] = true; odw[t[j]] = true; swap(t[j], t[t[j]]); } res.push_back(r); } cout << res.size() << endl; for(auto r : res){ cout << r.size()*2 << endl; for(int i = 0; i < r.size(); i++) cout << r[i].first << " "; for(int i = r.size()-1; i >= 0; i--) cout << r[i].second << " "; cout << endl; } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | //i:5 1670 2011 1560 1232 1447 //o:1 //i:6 1556 1449 1863 2014 1333 1220 //o:2 #include <bits/stdc++.h> using namespace std; int n; pair<int, int> tab[3000]; bool odw[3000]; int cdfs(int i){ odw[i] = true; if(!odw[tab[i].second]) return cdfs(tab[i].second) + 1; else return 1; } int cres = 0; vector<vector<pair<int, int>>> res; int t[3000]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; i++){ cin >> tab[i].first; tab[i].second = i; } sort(tab, tab + n); for(int i = 0; i < n; i++) t[tab[i].second] = i; while(true){ bool p = true; for(int i = 0; i < n; ++i) if(t[i] != i) p = false; if(p) break; fill(odw, odw + n, 0); vector<pair<int, int>> r; for(int j = 0; j < n; j++){ if(t[j] == j || odw[j] || odw[t[j]]) continue; r.emplace_back(j+1, t[j]+1); odw[j] = true; odw[t[j]] = true; swap(t[j], t[t[j]]); } res.push_back(r); } cout << res.size() << endl; for(auto r : res){ cout << r.size()*2 << endl; for(int i = 0; i < r.size(); i++) cout << r[i].first << " "; for(int i = r.size()-1; i >= 0; i--) cout << r[i].second << " "; cout << endl; } } |