Submission #331123

#TimeUsernameProblemLanguageResultExecution timeMemory
331123Vladth11Sorting (IOI15_sorting)C++14
100 / 100
274 ms24908 KiB
#include <bits/stdc++.h>
#include "sorting.h"
#define debug(x) cerr << #x << " " << x << "\n"
#define debug_with_space(x) cerr << #x << " " << x << " "

using namespace std;
typedef long long ll;
typedef pair <ll, ll> pii;
typedef pair <ll, pii> piii;

const ll NMAX = 200001;
const ll INF = (1 << 30);
const ll MOD = 1000000007;
const ll BLOCK = 101;
const ll nr_of_bits = 20;
const ll delta = 0.0000001;

int viz[NMAX];
int cop[NMAX];

bool OK(int p, int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    for(int i = 0; i < N; i++)
        S[i] = cop[i];
    for(int i = 0; i < p; i++) {
        swap(S[X[i]], S[Y[i]]);
    }
    for(int i = 0; i < N; i++)
        viz[i] = 0;
    int cc = 0;
    for(int i = 0; i < N; i++) {
        vector <int> ciclu;
        if(viz[i])
            continue;
        int pz = i;
        while(!viz[pz]) {
            ciclu.push_back(pz);
            viz[pz] = 1;
            pz = S[pz];
        }
        cc += ciclu.size() - 1;
    }
    return (cc <= p);
}

pii pr[NMAX * 3];
int poz[NMAX];

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
    P[0] = 0;
    Q[0] = 0;
    int i;
    int r = 0, pas = 1 << 20;
    for(int i = 0; i < N; i++) {
        cop[i] = S[i];
    }
    while(pas) {
        if(r + pas <= M && !OK(r + pas, N, S, M, X, Y, P, Q))
            r += pas;
        pas /= 2;
    }
    if(!OK(r + pas, N, S, M, X, Y, P, Q))
        r++;
    for(int i = 0; i < N; i++)
        S[i] = cop[i];
    for(int i = 0; i < r; i++) {
        swap(S[X[i]], S[Y[i]]);
    }
    for(int i = 0; i < N; i++) {
        viz[i] = 0;
    }
    int cc = 0;
    for(int i = 0; i < N; i++) {
        vector <int> ciclu;
        if(viz[i])
            continue;
        int pz = i;
        while(!viz[pz]) {
            ciclu.push_back(pz);
            viz[pz] = 1;
            pz = S[pz];
        }
        for(int j = ciclu.size() - 2; j >= 0; j--) {
            pr[++cc] = {S[ciclu[j + 1]], S[ciclu[j]]};
            swap(ciclu[j], ciclu[j + 1]);
        }
    }
    for(int i = N - 1; i >= 0; i--) {
        S[i] = cop[i];
    }
    for(int i = 0; i < N; i++) {
        poz[S[i]] = i;
    }
    for(int i = 0; i < r; i++) {
        int a = S[X[i]], b = S[Y[i]];
        swap(poz[a], poz[b]);
        swap(S[X[i]], S[Y[i]]);
        P[i] = poz[pr[i + 1].first];
        Q[i] = poz[pr[i + 1].second];
        a = P[i];
        b = Q[i];
        swap(poz[pr[i + 1].first], poz[pr[i + 1].second]);
        swap(S[a], S[b]);
    }
    return r;
}

Compilation message (stderr)

sorting.cpp:16:18: warning: conversion from 'double' to 'll' {aka 'long long int'} changes value from '9.9999999999999995e-8' to '0' [-Wfloat-conversion]
   16 | const ll delta = 0.0000001;
      |                  ^~~~~~~~~
sorting.cpp: In function 'bool OK(int, int, int*, int, int*, int*, int*, int*)':
sorting.cpp:40:30: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   40 |         cc += ciclu.size() - 1;
      |                              ^
sorting.cpp:21:36: warning: unused parameter 'M' [-Wunused-parameter]
   21 | bool OK(int p, int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
      |                                ~~~~^
sorting.cpp:21:61: warning: unused parameter 'P' [-Wunused-parameter]
   21 | bool OK(int p, int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
      |                                                         ~~~~^~~
sorting.cpp:21:70: warning: unused parameter 'Q' [-Wunused-parameter]
   21 | bool OK(int p, int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
      |                                                                  ~~~~^~~
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:53:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   53 |     for(int i = 0; i < N; i++) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:63:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   63 |     for(int i = 0; i < N; i++)
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:65:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   65 |     for(int i = 0; i < r; i++) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:68:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   68 |     for(int i = 0; i < N; i++) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:72:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   72 |     for(int i = 0; i < N; i++) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:82:34: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   82 |         for(int j = ciclu.size() - 2; j >= 0; j--) {
      |                     ~~~~~~~~~~~~~^~~
sorting.cpp:87:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   87 |     for(int i = N - 1; i >= 0; i--) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:90:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   90 |     for(int i = 0; i < N; i++) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:93:13: warning: declaration of 'i' shadows a previous local [-Wshadow]
   93 |     for(int i = 0; i < r; i++) {
      |             ^
sorting.cpp:51:9: note: shadowed declaration is here
   51 |     int i;
      |         ^
sorting.cpp:51:9: warning: unused variable 'i' [-Wunused-variable]
#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...