제출 #1083801

#제출 시각아이디문제언어결과실행 시간메모리
1083801ZeroCool정렬하기 (IOI15_sorting)C++14
100 / 100
177 ms32152 KiB
#include "sorting.h"
#include<bits/stdc++.h>
using namespace std;

#define ar array
#define ll long long
#define ld long double

vector<ar<int, 2>> ans, xy, swaps;
bool check(vector<int> p, int m, int n) {
    int s = 0;
    vector<int> e = p;
    vector<int> co(n, 0);
    for (int i = 0; i < n; i++) co[p[i]] = i;
    
    for (int i = 0; i < m; i++) swap(p[xy[i][0]], p[xy[i][1]]);
    
    for (int i = 0; i < n; i++) {
        if (p[i] == i) continue;
        
        while(p[i] != i) {
            int j = p[i];
            swaps.push_back({p[i], p[j]});
            swap(p[i], p[j]);
            s++;
        }
    }
    if (swaps.size() > m)return 0;
    
    while(swaps.size() < m) swaps.push_back({0, 0});
    
    for (int i = 0; i < m; i++) {
        swap(co[e[xy[i][0]]], co[e[xy[i][1]]]);
        swap(e[xy[i][0]], e[xy[i][1]]);
        auto [x, y] = swaps[i];
        swaps[i] = {co[x], co[y]};
        swap(e[co[x]], e[co[y]]);
        swap(co[x], co[y]);
    }
    return s <= m;
}
int findSwapPairs(int n, int A[], int m, int X[], int Y[], int P[], int Q[]) {
    vector<int> p(n);
    for (int i = 0; i < n; i++) p[i] = A[i];
    
    for (int i = 0; i < m; i++) xy.push_back({X[i], Y[i]});
    int l = 0, r = m - 1;
    while(l <= r) {
        int m = (l + r)/2;
        swaps.clear();
        if(check(p, m, n)){
            r = m - 1;
            ans = swaps;
        }else l = m + 1;
        
    }
    for (int i = 0; i < ans.size(); i++) {
        P[i] = ans[i][0];
        Q[i] = ans[i][1];
    }
    return ans.size();
}

컴파일 시 표준 에러 (stderr) 메시지

sorting.cpp: In function 'bool check(std::vector<int>, int, int)':
sorting.cpp:28:22: warning: comparison of integer expressions of different signedness: 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   28 |     if (swaps.size() > m)return 0;
      |         ~~~~~~~~~~~~~^~~
sorting.cpp:30:24: warning: comparison of integer expressions of different signedness: 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   30 |     while(swaps.size() < m) swaps.push_back({0, 0});
      |           ~~~~~~~~~~~~~^~~
sorting.cpp:35:14: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   35 |         auto [x, y] = swaps[i];
      |              ^
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:49:13: warning: declaration of 'int m' shadows a parameter [-Wshadow]
   49 |         int m = (l + r)/2;
      |             ^
sorting.cpp:42:39: note: shadowed declaration is here
   42 | int findSwapPairs(int n, int A[], int m, int X[], int Y[], int P[], int Q[]) {
      |                                   ~~~~^
sorting.cpp:57:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for (int i = 0; i < ans.size(); i++) {
      |                     ~~^~~~~~~~~~~~
sorting.cpp:61:20: warning: conversion from 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   61 |     return ans.size();
      |            ~~~~~~~~^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...