답안 #989178

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
989178 2024-05-27T16:55:40 Z crafticat 정렬하기 (IOI15_sorting) C++17
74 / 100
1000 ms 24228 KB
#include <bits/stdc++.h>

using namespace std;
using pii = pair<int,int>;

vector<int> x, y;
vector<int> initPos;
int n;

bool check(vector<pii> test) {
    vector<int> pos = initPos;
    for (int i = 0; i < test.size(); ++i) {
        swap(pos[x[i]],pos[y[i]]);
        swap(pos[test[i].first],pos[test[i].second]);
    }
    for (int i = 0; i < n; ++i) {
        if (pos[i] != i)
            return false;
    }
    return true;
}

vector<pii> solve(int m) {
    vector<int> pos = initPos;
    vector<int> orgPosTo(n), orgPos(n);
    set<int> notSorted;
    vector<pii> ans;
    for (int i = 0; i < n; ++i) {
        orgPosTo[i] = i;
    }
    for (int i = 0;i < m;i++) {
        swap(pos[x[i]],pos[y[i]]);
    }
    for (int i = m - 1; i >=0 ; --i) {
        swap(orgPosTo[x[i]],orgPosTo[y[i]]);
    }
    for (int i = 0; i < n; ++i) {
        orgPos[orgPosTo[i]] = i;
    }
    for (int i = 0; i < n; ++i) {
        if (pos[i] != i) notSorted.insert(i);
    }
    for (int i = 0; i < m; ++i) {
        auto it = notSorted.begin();
        int j = 0;
        swap(orgPosTo[x[i]],orgPosTo[y[i]]);
        orgPos[orgPosTo[x[i]]] = x[i];
        orgPos[orgPosTo[y[i]]] = y[i];
        if (it != notSorted.end()) {
            j = *it;
        }

        int target = pos[j];

        notSorted.erase(target);

        swap(pos[target],pos[j]);
        if (pos[j] == j) notSorted.erase(j);
        ans.emplace_back(orgPos[j],orgPos[target]);
    }
    if (!notSorted.empty()) return {};
    if (!check(ans)) exit(5);
    return ans;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    n = N;
    x.resize(M);
    y.resize(M);
    initPos.resize(n);

    for (int i = 0; i < M; ++i) {
        x[i] = X[i];
    }
    for (int i = 0; i < M; ++i) {
        y[i] = Y[i];
    }
    for (int i = 0; i < n; ++i) {
        initPos[i] = S[i];
    }

    bool stopIm = true;
    for (int i = 0; i < n; ++i) {
        if (initPos[i] != i) stopIm = false;
    }
    if (stopIm) return {};

    int l = 0, r = M;
    int test = 0;
    while (l < r) {
        int mid = l + (r - l) / 2;
        if (solve(mid).empty()) {
            l = mid + 1;
        } else
            r = mid;
        test++;
        if (test > 40) exit(50);
    }

    auto v = solve(l);
    if (!v.empty()) {
        for (int j = 0; j < v.size(); ++j) {
            P[j] = v[j].first;
        }
        for (int j = 0; j < v.size(); ++j) {
            Q[j] = v[j].second;
        }
        return v.size();
    }
}

#if DEBUG
static char _buffer[1024];
static int _currentChar = 0;
static int _charsNumber = 0;
static FILE *_inputFile, *_outputFile;

static inline int _read() {
    if (_charsNumber < 0) {
        exit(1);
    }
    if (!_charsNumber || _currentChar == _charsNumber) {
        _charsNumber = (int)fread(_buffer, sizeof(_buffer[0]), sizeof(_buffer), _inputFile);
        _currentChar = 0;
    }
    if (_charsNumber <= 0) {
        return -1;
    }
    return _buffer[_currentChar++];
}

static inline int _readInt() {
    int x; cin >> x;
    return x;
}


int main()
{
	_inputFile = fopen("sorting.in", "rb");
	_outputFile = fopen("sorting.out", "w");
	int N, M;
	N = _readInt();
	int *S = (int*)malloc(sizeof(int) * (unsigned int)N);
	for (int i = 0; i < N; ++i)
		S[i] = _readInt();
	M = _readInt();
	int *X = (int*)malloc(sizeof(int) * (unsigned int)M), *Y = (int*)malloc(sizeof(int) * (unsigned int)M);
	for (int i = 0; i < M; ++i) {
	    X[i] = _readInt();
	    Y[i] = _readInt();
	}
	int *P = (int*)malloc(sizeof(int) * (unsigned int)M), *Q = (int*)malloc(sizeof(int) * (unsigned int)M);
	int ans = findSwapPairs(N, S, M, X, Y, P, Q);
	cout << ans << endl;
	for (int i = 0; i < ans; ++i)
		cout << P[i] << " " << Q[i] << endl;
	return 0;
}
#endif

Compilation message

sorting.cpp: In function 'bool check(std::vector<std::pair<int, int> >)':
sorting.cpp:12:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   12 |     for (int i = 0; i < test.size(); ++i) {
      |                     ~~^~~~~~~~~~~~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:102:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  102 |         for (int j = 0; j < v.size(); ++j) {
      |                         ~~^~~~~~~~~~
sorting.cpp:105:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  105 |         for (int j = 0; j < v.size(); ++j) {
      |                         ~~^~~~~~~~~~
sorting.cpp:108:22: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  108 |         return v.size();
      |                ~~~~~~^~
sorting.cpp:100:21: warning: control reaches end of non-void function [-Wreturn-type]
  100 |     auto v = solve(l);
      |                     ^
# 결과 실행 시간 메모리 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
7 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 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
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 344 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 504 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 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
7 Correct 0 ms 348 KB Output is correct
8 Correct 0 ms 344 KB Output is correct
9 Correct 0 ms 348 KB Output is correct
10 Correct 1 ms 348 KB Output is correct
11 Correct 1 ms 348 KB Output is correct
12 Correct 0 ms 348 KB Output is correct
13 Correct 0 ms 348 KB Output is correct
14 Correct 0 ms 348 KB Output is correct
15 Correct 1 ms 504 KB Output is correct
16 Correct 0 ms 348 KB Output is correct
17 Correct 1 ms 348 KB Output is correct
18 Correct 0 ms 348 KB Output is correct
19 Correct 0 ms 348 KB Output is correct
20 Correct 0 ms 348 KB Output is correct
21 Correct 2 ms 604 KB Output is correct
22 Correct 2 ms 604 KB Output is correct
23 Correct 2 ms 604 KB Output is correct
24 Correct 3 ms 604 KB Output is correct
25 Correct 2 ms 860 KB Output is correct
26 Correct 2 ms 604 KB Output is correct
27 Correct 2 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 604 KB Output is correct
2 Correct 5 ms 604 KB Output is correct
3 Correct 5 ms 604 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 2 ms 604 KB Output is correct
6 Correct 3 ms 604 KB Output is correct
7 Correct 4 ms 604 KB Output is correct
8 Correct 5 ms 716 KB Output is correct
9 Correct 5 ms 604 KB Output is correct
10 Correct 5 ms 600 KB Output is correct
11 Correct 6 ms 604 KB Output is correct
12 Correct 4 ms 600 KB Output is correct
13 Correct 5 ms 708 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 604 KB Output is correct
2 Correct 5 ms 604 KB Output is correct
3 Correct 5 ms 604 KB Output is correct
4 Correct 1 ms 344 KB Output is correct
5 Correct 2 ms 604 KB Output is correct
6 Correct 3 ms 604 KB Output is correct
7 Correct 4 ms 604 KB Output is correct
8 Correct 5 ms 716 KB Output is correct
9 Correct 5 ms 604 KB Output is correct
10 Correct 5 ms 600 KB Output is correct
11 Correct 6 ms 604 KB Output is correct
12 Correct 4 ms 600 KB Output is correct
13 Correct 5 ms 708 KB Output is correct
14 Correct 1 ms 604 KB Output is correct
15 Execution timed out 1070 ms 24228 KB Time limit exceeded
16 Halted 0 ms 0 KB -