Submission #622419

# Submission time Handle Problem Language Result Execution time Memory
622419 2022-08-04T09:16:36 Z 8e7 Sorting (IOI15_sorting) C++17
36 / 100
69 ms 432 KB
//Challenge: Accepted
#include <bits/stdc++.h>
using namespace std;
#ifdef zisk
void debug(){cout << endl;}
template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...);}
template<class T> void pary(T l, T r){
	while (l != r) cout << *l << " ", l++;
	cout << endl;
}
#else
#define debug(...) 0
#define pary(...) 0
#endif
#define ll long long
#define maxn 200005
#define mod 1000000007
#define pii pair<int, int>
#define ff first
#define ss second
#include "sorting.h"

int findSwapPairs(int n, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	//int low = -1, up = M;
	vector<int> pos(n), rev(n);

	auto getp = [&] (int k) {
		vector<int> ret(n);
		vector<int> a(n);
		for (int i = 0;i < n;i++) a[i] = i;
		//[0, mid)
		for (int i = k-1;i >= 0;i--) {
			swap(a[X[i]], a[Y[i]]);	
		}
		for (int i = 0;i < n;i++) {
			pos[a[i]] = i;
			rev[i] = a[i];
			ret[a[i]] = S[i];
		}
		return ret;
	};
	for (int up = 0;up <= M;up++) {
		vector<int> v = getp(up);	
		vector<bool> vis(n, 0);
		vector<pii> sw;
		for (int i = 0;i < n;i++) {
			if (vis[i]) continue;
			int cur = i;
			do {
				vis[cur] = 1;
				if (!vis[v[cur]]) sw.push_back({cur, v[cur]});
				cur = v[cur];
			} while (!vis[cur]);
		}
		if (sw.size() > up) continue;
		reverse(sw.begin(), sw.end());	
		for (int i = 0;i < up;i++) {
			int vx = rev[X[i]], vy = rev[Y[i]];	
			swap(rev[X[i]], rev[Y[i]]);
			swap(pos[vx], pos[vy]);
			P[i] = pos[sw[i].ff];
			Q[i] = pos[sw[i].ss];
		}
		return up;
	}
	return M;
	/*
	while (low < up - 1) {
		int mid = (low + up) / 2;
		vector<int> v = getp(mid);
		vector<bool> vis(n, 0);
		int num = n;
		for (int i = 0;i < n;i++) {
			if (vis[i]) continue;
			int cur = i;
			do {
				vis[cur] = 1;
				cur = v[cur];
			} while (!vis[cur]);
			num--;
		}
		if (num <= mid) up = mid;
		else low = mid;
	}

	vector<int> v = getp(up);	
	vector<bool> vis(n, 0);
	vector<pii> sw;
	for (int i = 0;i < n;i++) {
		if (vis[i]) continue;
		int cur = i;
		do {
			vis[cur] = 1;
			if (!vis[v[cur]]) sw.push_back({cur, v[cur]});
			cur = v[cur];
		} while (!vis[cur]);
	}
	reverse(sw.begin(), sw.end());	
	for (int i = 0;i < up;i++) {
		int vx = rev[X[i]], vy = rev[Y[i]];	
		swap(rev[X[i]], rev[Y[i]]);
		swap(pos[vx], pos[vy]);
		P[i] = pos[sw[i].ff];
		Q[i] = pos[sw[i].ss];
	}
	return up;
	*/
}


Compilation message

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:55:17: warning: comparison of integer expressions of different signedness: 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   55 |   if (sw.size() > up) continue;
      |       ~~~~~~~~~~^~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 212 KB Output is correct
5 Correct 1 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Correct 0 ms 212 KB Output is correct
9 Correct 0 ms 212 KB Output is correct
10 Correct 1 ms 212 KB Output is correct
11 Correct 1 ms 212 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 1 ms 340 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 1 ms 212 KB Output is correct
18 Correct 1 ms 212 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Correct 5 ms 340 KB Output is correct
22 Incorrect 5 ms 432 KB Output isn't correct
23 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 61 ms 396 KB Output is correct
2 Correct 69 ms 404 KB Output is correct
3 Incorrect 63 ms 404 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 61 ms 396 KB Output is correct
2 Correct 69 ms 404 KB Output is correct
3 Incorrect 63 ms 404 KB Output isn't correct
4 Halted 0 ms 0 KB -