#include<iostream> #include<vector> #include<algorithm> #include <queue> #include <stack> using namespace std; void Swap(vector<int>& permutation, int i, int j){ int a = permutation[i]; permutation[i] = permutation[j]; permutation[j] = a; } void Sort(int n, vector<int>& data, vector<int>& permutation){ bool swaps = true; n--; while(swaps){ swaps = false; for(int i = 0; i < n; i++){ if(data[permutation[i]] <= data[permutation[i+1]])continue; Swap(permutation, i, i+1); swaps = true; } } } void Split(vector<int>& cycle, int s, int e, int depth, vector<queue<int>>& q, vector<stack<int>>& st){ int size = e - s + 1; //for(int i = s; i <= e; i++){ // cout<<cycle[i]<<" "; //}cout<<'\n'; if(size <= 1)return; queue<int> t1; stack<int> t2; while(q.size() <= depth){ q.push_back(t1); st.push_back(t2); } if(size == 2){ q[depth].push(cycle[s]); st[depth].push(cycle[e]); return; } if(size == 3){ q[depth].push(cycle[s + 1]); st[depth].push(cycle[s + 2]); if(q.size() <= depth + 1){ q.push_back(t1); st.push_back(t2); } q[depth + 1].push(cycle[s]); st[depth + 1].push(cycle[s + 1]); return; } q[depth].push(cycle[s - 1 + size / 2]); st[depth].push(cycle[e]); Split(cycle, s, s - 1 + size / 2, depth + 1, q, st); Split(cycle, s + size/2, e, depth + 1, q, st); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector<int> data(n + 1, 0); vector<int> permutation(n + 1, 0); vector<int> id(3001, 0); for(int i = 1; i<=n; i++){ cin>>data[i]; permutation[i] = i; id[data[i]] = i; } int j = 1; for(int i = 0; i < 3001; i++){ if(id[i] == 0)continue; permutation[id[i]] = j; j++; } //Sort(n + 1, data, permutation); //vector<int> copy = permutation; //for(int i = 0; i <= n; i++)permutation[copy[i]] = i;; //Permute(permutation); //for(int i= 0; i <= n; i++)cout<<i<<" "; //cout<<'\n'; //for(int i =0; i <= n; i++){ // cout<<permutation[i]<<" "; //}cout<<'\n'; vector<vector<int>> cycle; vector<int> temp(1, 0); vector<bool> visited(n+1, false); int maxCycle = 1, next, sizeNow; bool identity = true; for(int i = 0; i <= n; i++){ if(permutation[i] != i)identity = false; } if(identity){ cout<< 0; return 0; } for(int i = 0; i <= n; i++){ if(visited[i])continue; sizeNow = 1; temp[0] = i; cycle.push_back(temp); visited[i] = true; next = permutation[i]; while(!visited[next]){ cycle[cycle.size() - 1].push_back(next); visited[next] = true; sizeNow++; next = permutation[next]; } if(sizeNow > maxCycle)maxCycle = sizeNow; } vector<queue<int>> que; vector<stack<int>> sta; for(int i = 0; i < cycle.size(); i++) Split(cycle[i], 0, cycle[i].size() - 1, 0, que, sta); cout<<que.size()<<'\n'; if(que.size() == 0)return 0; for(int i = 0; i < que.size() - 1; i++){ cout<<que[i].size() * 2<<'\n'; while(!que[i].empty()){ cout<<que[i].front() << " "; que[i].pop(); } cout<<sta[i].top(); sta[i].pop(); while(!sta[i].empty()){ cout<<" "<<sta[i].top(); sta[i].pop(); } cout<<'\n'; } int i = que.size() - 1; cout<<que[i].size() * 2 <<'\n'; while(!que[i].empty()){ cout<<que[i].front() << " "; que[i].pop(); } cout<<sta[i].top(); sta[i].pop(); while(!sta[i].empty()){ cout<<" "<<sta[i].top(); sta[i].pop(); } /*int i = 0; int ans = maxCycle - 1; //stack<queue<int>> stacc; cout<<ans<<'\n'; while(i < ans){ queue<int> q; for(int j = 0; j < cycle.size(); j++){ if(cycle[j].size() - 1 <= i)continue; //cout<<cycle[j][cycle[j].size() - 1 - i]<< " "; q.push(cycle[j][cycle[j].size() - 1 - i]); } for(int j = cycle.size() - 1; j >= 0; j--){ if(cycle[j].size() - 1 <= i)continue; //cout<<cycle[j][cycle[j].size() - 1 - i - 1]<< " "; q.push(cycle[j][cycle[j].size() - 1 - i - 1]); } //stacc.push(q); cout<<q.size()<<'\n'; cout<<q.front(); q.pop(); while(!q.empty()){ cout<<" "<<q.front(); q.pop(); } cout<<'\n'; i++; }*/ /*while(!stacc.empty()){ queue<int>& q = stacc.top(); cout<<q.size()<<'\n'; cout<<q.front(); q.pop(); while(!q.empty()){ cout<<" "<<q.front(); q.pop(); } cout<<'\n'; stacc.pop(); }*/ 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 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 | #include<iostream> #include<vector> #include<algorithm> #include <queue> #include <stack> using namespace std; void Swap(vector<int>& permutation, int i, int j){ int a = permutation[i]; permutation[i] = permutation[j]; permutation[j] = a; } void Sort(int n, vector<int>& data, vector<int>& permutation){ bool swaps = true; n--; while(swaps){ swaps = false; for(int i = 0; i < n; i++){ if(data[permutation[i]] <= data[permutation[i+1]])continue; Swap(permutation, i, i+1); swaps = true; } } } void Split(vector<int>& cycle, int s, int e, int depth, vector<queue<int>>& q, vector<stack<int>>& st){ int size = e - s + 1; //for(int i = s; i <= e; i++){ // cout<<cycle[i]<<" "; //}cout<<'\n'; if(size <= 1)return; queue<int> t1; stack<int> t2; while(q.size() <= depth){ q.push_back(t1); st.push_back(t2); } if(size == 2){ q[depth].push(cycle[s]); st[depth].push(cycle[e]); return; } if(size == 3){ q[depth].push(cycle[s + 1]); st[depth].push(cycle[s + 2]); if(q.size() <= depth + 1){ q.push_back(t1); st.push_back(t2); } q[depth + 1].push(cycle[s]); st[depth + 1].push(cycle[s + 1]); return; } q[depth].push(cycle[s - 1 + size / 2]); st[depth].push(cycle[e]); Split(cycle, s, s - 1 + size / 2, depth + 1, q, st); Split(cycle, s + size/2, e, depth + 1, q, st); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vector<int> data(n + 1, 0); vector<int> permutation(n + 1, 0); vector<int> id(3001, 0); for(int i = 1; i<=n; i++){ cin>>data[i]; permutation[i] = i; id[data[i]] = i; } int j = 1; for(int i = 0; i < 3001; i++){ if(id[i] == 0)continue; permutation[id[i]] = j; j++; } //Sort(n + 1, data, permutation); //vector<int> copy = permutation; //for(int i = 0; i <= n; i++)permutation[copy[i]] = i;; //Permute(permutation); //for(int i= 0; i <= n; i++)cout<<i<<" "; //cout<<'\n'; //for(int i =0; i <= n; i++){ // cout<<permutation[i]<<" "; //}cout<<'\n'; vector<vector<int>> cycle; vector<int> temp(1, 0); vector<bool> visited(n+1, false); int maxCycle = 1, next, sizeNow; bool identity = true; for(int i = 0; i <= n; i++){ if(permutation[i] != i)identity = false; } if(identity){ cout<< 0; return 0; } for(int i = 0; i <= n; i++){ if(visited[i])continue; sizeNow = 1; temp[0] = i; cycle.push_back(temp); visited[i] = true; next = permutation[i]; while(!visited[next]){ cycle[cycle.size() - 1].push_back(next); visited[next] = true; sizeNow++; next = permutation[next]; } if(sizeNow > maxCycle)maxCycle = sizeNow; } vector<queue<int>> que; vector<stack<int>> sta; for(int i = 0; i < cycle.size(); i++) Split(cycle[i], 0, cycle[i].size() - 1, 0, que, sta); cout<<que.size()<<'\n'; if(que.size() == 0)return 0; for(int i = 0; i < que.size() - 1; i++){ cout<<que[i].size() * 2<<'\n'; while(!que[i].empty()){ cout<<que[i].front() << " "; que[i].pop(); } cout<<sta[i].top(); sta[i].pop(); while(!sta[i].empty()){ cout<<" "<<sta[i].top(); sta[i].pop(); } cout<<'\n'; } int i = que.size() - 1; cout<<que[i].size() * 2 <<'\n'; while(!que[i].empty()){ cout<<que[i].front() << " "; que[i].pop(); } cout<<sta[i].top(); sta[i].pop(); while(!sta[i].empty()){ cout<<" "<<sta[i].top(); sta[i].pop(); } /*int i = 0; int ans = maxCycle - 1; //stack<queue<int>> stacc; cout<<ans<<'\n'; while(i < ans){ queue<int> q; for(int j = 0; j < cycle.size(); j++){ if(cycle[j].size() - 1 <= i)continue; //cout<<cycle[j][cycle[j].size() - 1 - i]<< " "; q.push(cycle[j][cycle[j].size() - 1 - i]); } for(int j = cycle.size() - 1; j >= 0; j--){ if(cycle[j].size() - 1 <= i)continue; //cout<<cycle[j][cycle[j].size() - 1 - i - 1]<< " "; q.push(cycle[j][cycle[j].size() - 1 - i - 1]); } //stacc.push(q); cout<<q.size()<<'\n'; cout<<q.front(); q.pop(); while(!q.empty()){ cout<<" "<<q.front(); q.pop(); } cout<<'\n'; i++; }*/ /*while(!stacc.empty()){ queue<int>& q = stacc.top(); cout<<q.size()<<'\n'; cout<<q.front(); q.pop(); while(!q.empty()){ cout<<" "<<q.front(); q.pop(); } cout<<'\n'; stacc.pop(); }*/ return 0; } |