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
AC × 1
AC × 43
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