#include <bits/stdc++.h> using namespace std; const int roz=3e3+7; int n, pocz[roz], kon[roz]; pair<int,int> tab[roz]; set<pair<int,int>> secik; set<pair<int,int>>::iterator it; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i=1; i<=n; i++) { cin >> tab[i].first; tab[i].second=i; } sort(tab+1, tab+n+1); for(int i=1; i<=n; i++) { pocz[tab[i].second]=i; // jaki jest koniec jesli poczatek to tab[i].second kon[i]=tab[i].second; if(tab[i].second!=i) secik.insert(make_pair(tab[i].second, i)); } vector<int> v1, v2, v3, v4; pair<int,int> teraz=make_pair(0,0); while(!secik.empty()) { pair<int,int> wzor; if(teraz==make_pair(0,0)) it=secik.begin(); else { it=secik.find(teraz); teraz=make_pair(0,0); } wzor=(*it); secik.erase(it); int pa=wzor.second, ka=pocz[wzor.second], pb=kon[wzor.first], kb=wzor.first; secik.erase(secik.find(make_pair(pa, ka))); if(pa==pb && ka==kb) { v3.push_back(wzor.first); v4.push_back(wzor.second); } else { secik.erase(secik.find(make_pair(pb, kb))); v1.push_back(pa); v2.push_back(pb); v3.push_back(wzor.first); v4.push_back(wzor.second); if(pb!=ka) { secik.insert(make_pair(pb, ka)); teraz=make_pair(pb, ka); } pocz[pb]=ka; kon[ka]=pb; pocz[pa]=kb; kon[kb]=pa; } } if(v1.empty() && v3.empty()) { cout << "0\n"; return 0; } if(v1.empty()) cout << "1\n"; else { cout << "2\n"; cout << (2*v1.size()) << '\n'; for(int i=0; i<v1.size(); i++) cout << v1[i] << ' '; for(int i=v2.size()-1; i>=0; i--) cout << v2[i] << ' '; cout << '\n'; } cout << (2*v3.size()) << '\n'; for(int i=0; i<v3.size(); i++) cout << v3[i] << ' '; for(int i=v4.size()-1; i>=0; i--) cout << v4[i] << ' '; cout << '\n'; return 0; }
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | #include <bits/stdc++.h> using namespace std; const int roz=3e3+7; int n, pocz[roz], kon[roz]; pair<int,int> tab[roz]; set<pair<int,int>> secik; set<pair<int,int>>::iterator it; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for(int i=1; i<=n; i++) { cin >> tab[i].first; tab[i].second=i; } sort(tab+1, tab+n+1); for(int i=1; i<=n; i++) { pocz[tab[i].second]=i; // jaki jest koniec jesli poczatek to tab[i].second kon[i]=tab[i].second; if(tab[i].second!=i) secik.insert(make_pair(tab[i].second, i)); } vector<int> v1, v2, v3, v4; pair<int,int> teraz=make_pair(0,0); while(!secik.empty()) { pair<int,int> wzor; if(teraz==make_pair(0,0)) it=secik.begin(); else { it=secik.find(teraz); teraz=make_pair(0,0); } wzor=(*it); secik.erase(it); int pa=wzor.second, ka=pocz[wzor.second], pb=kon[wzor.first], kb=wzor.first; secik.erase(secik.find(make_pair(pa, ka))); if(pa==pb && ka==kb) { v3.push_back(wzor.first); v4.push_back(wzor.second); } else { secik.erase(secik.find(make_pair(pb, kb))); v1.push_back(pa); v2.push_back(pb); v3.push_back(wzor.first); v4.push_back(wzor.second); if(pb!=ka) { secik.insert(make_pair(pb, ka)); teraz=make_pair(pb, ka); } pocz[pb]=ka; kon[ka]=pb; pocz[pa]=kb; kon[kb]=pa; } } if(v1.empty() && v3.empty()) { cout << "0\n"; return 0; } if(v1.empty()) cout << "1\n"; else { cout << "2\n"; cout << (2*v1.size()) << '\n'; for(int i=0; i<v1.size(); i++) cout << v1[i] << ' '; for(int i=v2.size()-1; i>=0; i--) cout << v2[i] << ' '; cout << '\n'; } cout << (2*v3.size()) << '\n'; for(int i=0; i<v3.size(); i++) cout << v3[i] << ' '; for(int i=v4.size()-1; i>=0; i--) cout << v4[i] << ' '; cout << '\n'; return 0; } |