Submission #1088438

# Submission time Handle Problem Language Result Execution time Memory
1088438 2024-09-14T11:28:29 Z Pacybwoah Sorting (IOI15_sorting) C++17
16 / 100
1 ms 604 KB
#include "sorting.h"
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include<cassert>
using namespace std;
namespace{
	struct DSU{
		vector<int> dsu, sz;
		DSU(int n){
			dsu.resize(n + 1);
			sz.resize(n + 1);
			for(int i = 1; i <= n; i++) dsu[i] = i, sz[i] = 1;
		}
		int query(int x){
			if(x == dsu[x]) return x;
			dsu[x] = query(dsu[x]);
			return dsu[x];
		}
		void unite(int a, int b){
			a = query(a);
			b = query(b);
			if(a == b) return;
			if(sz[a] < sz[b]) swap(a, b);
			dsu[b] = a;
			sz[a] += sz[b];
		}
	};
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
	int n = N;
	for(int i = 0; i < M; i++) assert(X[i] == 0 && Y[i] == 1);
	vector<int> pos(n);
	for(int i = 0; i < n; i++) pos[S[i]] = i;
	int now = n - 1, cur;
	if(n == 2){
		if(S[0] == 0) return 0;
		else{
			P[0] = 0;
			Q[0] = 0;
			return 1;
		}
	}
	for(int i = 0; i < M; i++){
		swap(S[X[i]], S[Y[i]]);
		swap(pos[S[X[i]]], pos[S[Y[i]]]);
		if(pos[now] == now){
			P[i] = now;
			Q[i] = now;
		}
		else{
			P[i] = now;
			Q[i] = pos[now];
			swap(S[now], S[pos[now]]);
			swap(pos[S[now]], pos[S[pos[now]]]);
		}
		if(now == 2){
			cur = i;
			break;
		}
		now--;
	}
	cur++;
	if(S[0] == 0){
		return cur;
	}
	else{
		P[cur] = 0;
		Q[cur] = 0;
		return cur + 1;
	}
    /*int l = 0, r = M;
	while(l < r){
		int mid = (l + r) >> 1;
		DSU dsu(n);
		vector<int> vec(n);
		for(int i = 0; i < n; i++) vec[i] = S[i];
		for(int i = 0; i < mid; i++) swap(vec[X[i]], vec[Y[i]]);
		for(int i = 0; i < n; i++) dsu.unite(vec[i], i);
		vector<bool> vis(n);
		int cc = 0;
		for(int i = 0; i < n; i++){
			if(!vis[dsu.query(i)]){
				vis[dsu.query(i)] = 1;
				cc++;
			}
		}
		if(n - cc <= mid) r = mid;
		else l = mid + 1;
	}
	DSU dsu(n);
	vector<int> pos(n);
	for(int i = 0; i < l; i++) swap(S[X[i]], S[Y[i]]);
	for(int i = 0; i < n; i++) dsu.unite(i, S[i]), pos[S[i]] = i;
	vector<vector<int>> children(n);
	for(int i = 0; i < n; i++) children[dsu.query(i)].push_back(i);
	int cur = 0;
	for(int i = 0; i < n; i++){
		if((int)children[i].size() >= 2){
			int sz = children[i].size();
			for(int j = 0; j < sz - 1; j++){
				int id = children[i][j];
				P[cur] = id;
				Q[cur] = pos[id];
				swap(S[P[cur]], S[Q[cur]]);
				swap(pos[S[P[cur]]], pos[S[Q[cur]]]);
				cur++;
			}
		}
	}
	while(cur < l - 1){
		P[cur] = 0;
		Q[cur] = 0;
		cur++;
	}
	return l;*/
}
// g++ -std=c++17 -Wall -Wextra -fsanitize=undefined -fsanitize=address -Wshadow -o run sorting.cpp grader.cpp

Compilation message

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:65:5: warning: 'cur' may be used uninitialized in this function [-Wmaybe-uninitialized]
   65 |  cur++;
      |  ~~~^~
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 344 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 344 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 344 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 604 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Runtime error 1 ms 604 KB Execution killed with signal 6
2 Halted 0 ms 0 KB -