This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "sorting.h"
#include <bits/stdc++.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef vector<ll> vi;
typedef pair<ll,ll> ii;
typedef vector<ii> vii;
#define rep(i,a,b) for(int i = a; i < b; i++)
#define per(i,a,b) for(int i = a; i >= b; i--)
#define inf 9223372036854775807
#define all(x) x.begin(),x.end()
#define sz(x) (ll)(x).size()
#define trav(a,x) for(auto& a : x)
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
ll lo = -1, hi = N, mid;
while (lo+1 < hi){
mid = (lo+hi)/2;
vi last; last.assign(N,0);
rep(i,0,N) last[i] = S[i];
rep(i,0,mid){
ll t1 = last[X[i]];
ll t2 = last[Y[i]];
last[Y[i]] = t1;
last[X[i]] = t2;
}
vi inv; inv.assign(N,0);
rep(i,0,N) inv[last[i]] = i;
ll cur = 0;
rep(i,0,mid){
while (cur < N && inv[cur] == cur) cur++;
if (cur == N) break;
ll s = last[cur],ls = inv[cur];
last[ls] = s;
last[cur] = cur;
inv[cur] = cur;
inv[s] = ls;
}
bool check = true;
rep(i,0,N) if (inv[i] != i) check = false;
if (check) {
hi = mid;
} else {
lo = mid;
}
}
if (hi == 0){
bool check = true;
rep(i,0,N) if (S[i] != i) check = false;
if (check) return 0;
else hi = 1;
}
vi last; last.assign(N,0);
rep(i,0,N) last[i] = S[i];
rep(i,0,hi){
ll t1 = last[X[i]];
ll t2 = last[Y[i]];
last[Y[i]] = t1;
last[X[i]] = t2;
}
vi inv; inv.assign(N,0);
rep(i,0,N) inv[last[i]] = i;
ll cur = 0;
vii swap;
rep(i,0,hi){
while (cur < N && inv[cur] == cur) cur++;
if (cur == N) break;
ll s = last[cur],ls = inv[cur];
swap.push_back(make_pair(s,cur));
last[ls] = s;
last[cur] = cur;
inv[cur] = cur;
inv[s] = ls;
}
while (sz(swap) < hi) swap.push_back(make_pair(0,0));
last.assign(N,0);
inv.assign(N,0);
rep(i,0,N) last[i] = S[i];
rep(i,0,N) inv[last[i]] = i;
rep(i,0,hi){
ll t1 = last[X[i]];
ll t2 = last[Y[i]];
last[Y[i]] = t1;
last[X[i]] = t2;
inv[t1] = Y[i];
inv[t2] = X[i];
//
P[i] = inv[swap[i].first];
Q[i] = inv[swap[i].second];
last[P[i]] = swap[i].second;
last[Q[i]] = swap[i].first;
inv[swap[i].first] = Q[i];
inv[swap[i].second] = P[i];
}
return hi;
}
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 c, x, s;
c = _read();
while (c <= 32) c = _read();
x = 0;
s = 1;
if (c == '-') {
s = -1;
c = _read();
}
while (c > 32) {
x *= 10;
x += c - '0';
c = _read();
}
if (s < 0) x = -x;
return x;
}
Compilation message (stderr)
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:92:29: warning: conversion to 'int' from '__gnu_cxx::__alloc_traits<std::allocator<long long int> >::value_type {aka long long int}' may alter its value [-Wconversion]
P[i] = inv[swap[i].first];
^
sorting.cpp:93:30: warning: conversion to 'int' from '__gnu_cxx::__alloc_traits<std::allocator<long long int> >::value_type {aka long long int}' may alter its value [-Wconversion]
Q[i] = inv[swap[i].second];
^
sorting.cpp:99:9: warning: conversion to 'int' from 'll {aka long long int}' may alter its value [-Wconversion]
return hi;
^~
sorting.cpp:19:39: warning: unused parameter 'M' [-Wunused-parameter]
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
^
sorting.cpp: At global scope:
sorting.cpp:105:27: warning: '_outputFile' defined but not used [-Wunused-variable]
static FILE *_inputFile, *_outputFile;
^~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |