답안 #778358

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
778358 2023-07-10T08:52:02 Z danikoynov 정렬하기 (IOI15_sorting) C++14
74 / 100
1000 ms 9868 KB
#include "sorting.h"
#include<bits/stdc++.h>

using namespace std;

const int maxn = 2e5 + 10;
int n, arr[maxn], used[maxn];
vector < pair < int, int > > edges;
int count_steps()
{
    for (int i = 0; i < n; i ++)
        used[i] = 0;
    int ans = 0;
    for (int i = 0; i < n; i ++)
    {
        if (used[i])
            continue;
        int v = arr[i], cnt = 0;
        while(v != i)
        {
            used[v] = 1;
            cnt ++;
            v = arr[v];
        }
        used[v] = 1;
        cnt ++;
        ans = ans + (cnt - 1);
    }
    return ans;
}

void build_edges()
{
    for (int i = 0; i < n; i ++)
        used[i] = 0;
    for (int i = 0; i < n; i ++)
    {
        if (used[i])
            continue;
        vector < int > ord;
        int v = arr[i];
        while(v != i)
        {
            ord.push_back(v);
            used[v] = 1;
            v = arr[v];
        }
        ord.push_back(i);
        used[i] = 1;

        for (int i = 0; i < ord.size() - 1; i ++)
            edges.push_back({arr[ord[i]], arr[ord[i + 1]]});
    }
}

int pos[maxn];
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[])
{
    n = N;
    bool sorted = true;
    for (int i = 0; i < N; i ++)
        if (S[i] != i)
            sorted = false;

    if (sorted)
        return 0;
    for (int i = 0; i < N; i ++)
        arr[i] = S[i];

    int pivot = -1;
    for (int i = 0; i < M; i ++)
    {
        swap(arr[X[i]], arr[Y[i]]);
        int steps = count_steps();
        /**cout << "--------------" << endl;
        for (int j = 0; j < N; j ++)
            cout << arr[j] << " ";
        cout << endl;
        cout << steps << endl;*/
        if (steps <= i + 1)
        {
            pivot = i;
            break;
        }
    }
    ///assert(pivot != -1);
    ///cout << pivot << endl;
    ///exit(0);
    build_edges();
    for (int i = 0; i < n; i ++)
        pos[S[i]] = i;
    for (int i = 0; i < edges.size(); i ++)
    {         int id1 = 0, id2 = 0;
        while(pos[id1] != X[i])
            id1 ++;
        while(pos[id2] != Y[i])
            id2 ++;
        swap(pos[id1], pos[id2]);
        ///cout << edges[i].first << " : " << edges[i].second << endl;
        P[i] = pos[edges[i].first];
        Q[i] = pos[edges[i].second];
        swap(pos[edges[i].first], pos[edges[i].second]);

            ///cout << id1 << " : " << id2 << endl;

        ///swap(pos[X[i]], pos[Y[i]]);
    }
    int left = pivot - edges.size() + 1;
    if (left % 2 == 0)
    {
        for (int i = edges.size(); i <= pivot; i ++)
        {
            P[i] = 0;
            Q[i] = 1;
        }
    }
    else
    {
        for (int i = edges.size(); i < pivot; i ++)
        {
            P[i] = 0;
            Q[i] = 1;
        }
        P[pivot] = Q[pivot] = 0;
    }

    /**for (int i = 0; i <= pivot; i ++)
    { swap(S[X[i]], S[Y[i]]);
        swap(S[P[i]], S[Q[i]]);

    }*/
    /**for (int i = 0; i < N; i ++)
        cout << S[i] << " ";
    cout << endl;*/
    ///cout << "stop " << edges.size() << " " << pivot << endl;


    return pivot + 1;
}


Compilation message

sorting.cpp: In function 'void build_edges()':
sorting.cpp:51:18: warning: declaration of 'i' shadows a previous local [-Wshadow]
   51 |         for (int i = 0; i < ord.size() - 1; i ++)
      |                  ^
sorting.cpp:36:14: note: shadowed declaration is here
   36 |     for (int i = 0; i < n; i ++)
      |              ^
sorting.cpp:51:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |         for (int i = 0; i < ord.size() - 1; i ++)
      |                         ~~^~~~~~~~~~~~~~~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:92: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]
   92 |     for (int i = 0; i < edges.size(); i ++)
      |                     ~~^~~~~~~~~~~~~~
sorting.cpp:108:37: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  108 |     int left = pivot - edges.size() + 1;
      |                ~~~~~~~~~~~~~~~~~~~~~^~~
sorting.cpp:111:32: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  111 |         for (int i = edges.size(); i <= pivot; i ++)
      |                      ~~~~~~~~~~^~
sorting.cpp:119:32: warning: conversion from 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
  119 |         for (int i = edges.size(); i < pivot; i ++)
      |                      ~~~~~~~~~~^~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 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
# 결과 실행 시간 메모리 Grader output
1 Correct 0 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 284 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 0 ms 340 KB Output is correct
12 Correct 1 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Correct 0 ms 212 KB Output is correct
3 Correct 1 ms 256 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 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 284 KB Output is correct
10 Correct 0 ms 340 KB Output is correct
11 Correct 0 ms 340 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 256 KB Output is correct
16 Correct 1 ms 340 KB Output is correct
17 Correct 1 ms 332 KB Output is correct
18 Correct 1 ms 312 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 0 ms 212 KB Output is correct
21 Correct 2 ms 452 KB Output is correct
22 Correct 2 ms 456 KB Output is correct
23 Correct 2 ms 528 KB Output is correct
24 Correct 2 ms 456 KB Output is correct
25 Correct 1 ms 468 KB Output is correct
26 Correct 1 ms 456 KB Output is correct
27 Correct 2 ms 452 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 340 KB Output is correct
2 Correct 12 ms 456 KB Output is correct
3 Correct 11 ms 496 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 468 KB Output is correct
6 Correct 2 ms 468 KB Output is correct
7 Correct 5 ms 468 KB Output is correct
8 Correct 11 ms 468 KB Output is correct
9 Correct 11 ms 520 KB Output is correct
10 Correct 11 ms 576 KB Output is correct
11 Correct 10 ms 468 KB Output is correct
12 Correct 5 ms 468 KB Output is correct
13 Correct 10 ms 452 KB Output is correct
14 Correct 1 ms 468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 340 KB Output is correct
2 Correct 12 ms 456 KB Output is correct
3 Correct 11 ms 496 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 468 KB Output is correct
6 Correct 2 ms 468 KB Output is correct
7 Correct 5 ms 468 KB Output is correct
8 Correct 11 ms 468 KB Output is correct
9 Correct 11 ms 520 KB Output is correct
10 Correct 11 ms 576 KB Output is correct
11 Correct 10 ms 468 KB Output is correct
12 Correct 5 ms 468 KB Output is correct
13 Correct 10 ms 452 KB Output is correct
14 Correct 1 ms 468 KB Output is correct
15 Execution timed out 1049 ms 9868 KB Time limit exceeded
16 Halted 0 ms 0 KB -