Submission #45321886
Source Code Expand
#ifndef BZ #pragma GCC optimize "-O3" #endif #include <bits/stdc++.h> #define ALL(v) (v).begin(), (v).end() #define rep(i, l, r) for (int i = (l); i < (r); ++i) using ll = long long; using ld = long double; using ull = unsigned long long; using namespace std; /* ll pw(ll a, ll b) { ll ans = 1; while (b) { while (!(b & 1)) b >>= 1, a = (a * a) % MOD; ans = (ans * a) % MOD, --b; } return ans; } */ void solve() { int n; cin >> n; vector<int> p(n); for (int i = 0; i < n; ++i) { cin >> p[i]; --p[i]; } vector<pair<int, int>> ans; set<int> left, right; for (int i = 0; i < n; ++i) { left.emplace(i); right.emplace(i); } while (true) { while (!left.empty() && p[*left.begin()] >= *left.begin()) { left.erase(left.begin()); } if (left.empty()) { break; } int l = *left.begin(); vector<int> go; int x = p[l]; go.push_back(x); while (p[x] < l) { x = p[x]; go.push_back(x); } go.push_back(l); for (int i = go.size() - 1; i > 0; --i) { ans.emplace_back(go[i - 1], go[i]); swap(p[go[i - 1]], p[go[i]]); } if (p[l] == l) { ans.emplace_back(0, 0); } else { right.emplace(l); } while (!right.empty() && p[*right.rbegin()] <= *right.rbegin()) { right.erase(*right.rbegin()); } if (right.empty()) { break; } int r = *right.rbegin(); go.clear(); x = p[r]; go.push_back(x); while (p[x] > r) { x = p[x]; go.push_back(x); } go.push_back(r); for (int i = go.size() - 1; i > 0; --i) { ans.emplace_back(go[i - 1], go[i]); swap(p[go[i - 1]], p[go[i]]); } if (p[r] == r) { ans.emplace_back(0, 0); } else { left.emplace(r); } } for (int i = 0; i < n; ++i) { assert(p[i] == i); } if (!ans.empty()) { assert(ans.back() == std::pair(0, 0)); ans.pop_back(); } assert(ans.size() <= n - 1); for (int i = 0; i + 1 < ans.size(); ++i) { assert(ans[i].second <= ans[i + 1].first || ans[i + 1].second <= ans[i].first); } cout << ans.size() << "\n"; for (auto [l, r]: ans) { if (l > r) { swap(l, r); } cout << l + 1 << " " << r + 1 << "\n"; } } int main() { ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0); cout.setf(ios::fixed), cout.precision(20); int tt; cin >> tt; for (int i = 0; i < tt; ++i) { solve(); } return 0; }
Submission Info
Submission Time | |
---|---|
Task | B - Non-Overlapping Swaps |
User | LHiC |
Language | C++ 20 (gcc 12.2) |
Score | 1000 |
Code Size | 2408 Byte |
Status | AC |
Exec Time | 178 ms |
Memory | 30360 KiB |
Compile Error
In file included from /usr/include/c++/12/cassert:44, from /usr/include/x86_64-linux-gnu/c++/12/bits/stdc++.h:33, from Main.cpp:4: Main.cpp: In function ‘void solve()’: Main.cpp:100:27: warning: comparison of integer expressions of different signedness: ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} and ‘int’ [-Wsign-compare] 100 | assert(ans.size() <= n - 1); | ~~~~~~~~~~~^~~~~~~~ Main.cpp:101:31: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<std::pair<int, int> >::size_type’ {aka ‘long unsigned int’} [-Wsign-compare] 101 | for (int i = 0; i + 1 < ans.size(); ++i) { | ~~~~~~^~~~~~~~~~~~
Judge Result
Set Name | Sample | All | ||||
---|---|---|---|---|---|---|
Score / Max Score | 0 / 0 | 1000 / 1000 | ||||
Status |
|
|
Set Name | Test Cases |
---|---|
Sample | 00-sample-001.txt |
All | 00-sample-001.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt, 01-037.txt, 01-038.txt, 01-039.txt, 01-040.txt, 01-041.txt, 01-042.txt |
Case Name | Status | Exec Time | Memory |
---|---|---|---|
00-sample-001.txt | AC | 1 ms | 3516 KiB |
01-001.txt | AC | 54 ms | 3380 KiB |
01-002.txt | AC | 53 ms | 3524 KiB |
01-003.txt | AC | 53 ms | 3508 KiB |
01-004.txt | AC | 55 ms | 3416 KiB |
01-005.txt | AC | 55 ms | 3580 KiB |
01-006.txt | AC | 55 ms | 3452 KiB |
01-007.txt | AC | 55 ms | 3588 KiB |
01-008.txt | AC | 55 ms | 3416 KiB |
01-009.txt | AC | 55 ms | 3584 KiB |
01-010.txt | AC | 55 ms | 3588 KiB |
01-011.txt | AC | 55 ms | 3516 KiB |
01-012.txt | AC | 55 ms | 3644 KiB |
01-013.txt | AC | 56 ms | 3524 KiB |
01-014.txt | AC | 55 ms | 3592 KiB |
01-015.txt | AC | 29 ms | 3444 KiB |
01-016.txt | AC | 125 ms | 9332 KiB |
01-017.txt | AC | 127 ms | 9364 KiB |
01-018.txt | AC | 96 ms | 5304 KiB |
01-019.txt | AC | 96 ms | 5196 KiB |
01-020.txt | AC | 85 ms | 3616 KiB |
01-021.txt | AC | 84 ms | 3596 KiB |
01-022.txt | AC | 68 ms | 3524 KiB |
01-023.txt | AC | 66 ms | 3508 KiB |
01-024.txt | AC | 84 ms | 3688 KiB |
01-025.txt | AC | 83 ms | 3640 KiB |
01-026.txt | AC | 96 ms | 4632 KiB |
01-027.txt | AC | 96 ms | 4624 KiB |
01-028.txt | AC | 171 ms | 30308 KiB |
01-029.txt | AC | 173 ms | 30300 KiB |
01-030.txt | AC | 178 ms | 30344 KiB |
01-031.txt | AC | 175 ms | 30348 KiB |
01-032.txt | AC | 175 ms | 30332 KiB |
01-033.txt | AC | 115 ms | 27680 KiB |
01-034.txt | AC | 154 ms | 29668 KiB |
01-035.txt | AC | 173 ms | 30308 KiB |
01-036.txt | AC | 173 ms | 30240 KiB |
01-037.txt | AC | 164 ms | 30344 KiB |
01-038.txt | AC | 165 ms | 30316 KiB |
01-039.txt | AC | 169 ms | 30200 KiB |
01-040.txt | AC | 172 ms | 30268 KiB |
01-041.txt | AC | 168 ms | 30324 KiB |
01-042.txt | AC | 163 ms | 30360 KiB |