Submission #924665

#TimeUsernameProblemLanguageResultExecution timeMemory
924665IanisCat (info1cup19_cat)C++17
100 / 100
352 ms33000 KiB
#ifdef LOCAL #include <iostream> #include <fstream> #include <iomanip> #include <cassert> #include <random> #include <vector> #include <queue> #include <stack> #include <set> #include <map> #else #pragma GCC optimize("Ofast,unroll-loops") #include <bits/stdc++.h> #define cerr if (false) cerr #define endl '\n' #endif #define fi first #define se second #define sz(a) ((int)(a).size()) #define all(a) (a).begin(), (a).end() #define lsb(x) (x & (-x)) #define bit(mask, i) (((mask) >> (i)) & 1) #define popcount(x) __builtin_popcount(x) #define YES cout << "YES" << endl #define NO cout << "NO" << endl using namespace std; template <typename T> bool ckmax(T &a, T b) { return a < b ? a = b, true : false; } template <typename T> bool ckmin(T &a, T b) { return a > b ? a = b, true : false; } using ll = long long; using pii = pair<int, int>; const int NMAX = 3e6+5; int n; int a[NMAX]; int pos[NMAX]; vector<pii> ans; vector<pii> bad; void read() { cin >> n; for (int i = 1; i <= n; i++) { cin >> a[i]; pos[a[i]] = i; } } void my_swap(int i, int j) { ans.push_back({ i, j }); swap(pos[a[i]], pos[a[j]]); swap(a[i], a[j]); swap(pos[a[n - i + 1]], pos[a[n - j + 1]]); swap(a[n - i + 1], a[n - j + 1]); } void solve() { ans.clear(); bad.clear(); for (int i = 1; i <= n / 2; i++) { if (a[i] != i) { if (a[i] == n - i + 1) { bad.push_back({ i, n - i + 1 }); } else { my_swap(i, pos[i]); } } } for (int i = 0; i + 1 < int(bad.size()); i += 2) { my_swap(bad[i].fi, bad[i + 1].fi); my_swap(bad[i].fi, bad[i + 1].se); } for (int i = 1; i <= n; i++) { if (a[i] != i) { cout << -1 << endl; return; } } cout << ans.size() << ' ' << ans.size() << endl; for (auto &[ i, j ] : ans) cout << i << ' ' << j << endl; } signed main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); int t = 1; cin >> t; while (t--) { read(); solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...