이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
/// In The Name Of God
#include "sorting.h"
#include <bits/stdc++.h>
#define f first
#define s second
#define pb push_back
#define pp pop_back
#define mp make_pair
#define sz(x) (int)x.size()
#define sqr(x) ((x) * 1ll * (x))
#define all(x) x.begin(), x.end()
#define rep(i, l, r) for (int i = (l); i < (r); i++)
#define per(i, l, r) for (int i = (l); i >= (r); i--)
#define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define nl '\n'
#define ioi exit(0);
const int MAXN = (int)2e5 + 7;
using namespace std;
int n, m;
int a[MAXN], b[MAXN], x[MAXN], y[MAXN];
bool check(int len) {
rep(i, 0, n) {
b[i] = a[i];
}
rep(i, 0, len) {
swap(b[x[i]], b[y[i]]);
}
int cnt = 0;
rep(i, 0, n) {
if (b[i] != i) {
++cnt;
swap(b[i], b[b[i]]);
}
}
if (cnt > len) return 0;
return 1;
}
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) {
{
n = N;
m = M;
rep(i, 0, n) {
a[i] = S[i];
}
rep(i, 0, m) {
x[i] = X[i];
y[i] = Y[i];
}
} // copying
int l = 1, r = M, res = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (check(mid)) res = mid, r = mid - 1;
else l = mid + 1;
}
assert(res != -1);
// opt len found
rep(i, 0, n) {
b[i] = a[i];
}
rep(i, 0, res) {
swap(b[x[i]], b[y[i]]);
}
set <int> st;
int go[n];
rep(i, 0, n) {
if (b[i] != i) {
st.insert(b[i]);
}
go[b[i]] = i;
}
int ptr = 0;
while (sz(st)) {
int x = *st.begin();
st.erase(st.begin());
if (go[x] == x) continue;
swap(a[X[ptr]], a[Y[ptr]]);
//swap(go[a[X[ptr]]], go[a[Y[ptr]]]);
//cerr << x << nl;
int p1 = find(a, a + n, x) - a;
rep(i, 0, n) {
if (go[i] == x) {
int p2 = find(a, a + n, i) - a;
P[ptr] = p1;
Q[ptr] = p2;
swap(go[x], go[i]);
swap(a[p1], a[p2]);
ptr++;
break;
}
}
}
return res;
}
#ifdef IOI2018
int main() {
if (0) {
freopen ("sorting.in", "r", stdin);
int n, m;
cin >> n;
int s[n], c[n];
for (int i = 0; i < n; i++) cin >> s[i], c[i] = s[i];
cin >> m;
int x[m], y[m];
for (int i = 0; i < m; i++) cin >> x[i] >> y[i];
int p[m], q[m];
int ans = findSwapPairs(n, s, m, x, y, p, q);
for (int i = 0; i < ans; i++) {
swap(c[x[i]], c[y[i]]);
swap(c[p[i]], c[q[i]]);
}
for (int i = 0; i < n; i++) {
cout << c[i] << ' ';
}
ioi
}
srand(time(0));
for (int T = 5; T <= 100; T++) {
srand(T);
int n = rand() % 5 + 1, m = 30 * n;
int s[n], a[n], c[n];
for (int i = 0; i < n; i++) s[i] = i;
random_shuffle(s, s + n);
for (int i = 0; i < n; i++) a[i] = c[i] = s[i];
int x[m], y[m];
for (int i = 0; i < m; i++) {
x[i] = 0, y[i] = 1;
}
int p[m], q[m];
int ans = findSwapPairs(n, s, m, x, y, p, q);
for (int i = 0; i < ans; i++) {
swap(c[x[i]], c[y[i]]);
swap(c[p[i]], c[q[i]]);
}
bool bad = 0;
for (int i = 0; i < n; i++) {
if (c[i] != i) bad = 1;
}
if (bad == 1) {
cout << n << nl;
for (int i = 0; i < n; i++) cout << a[i] << ' ';
cout << nl;
cout << m << nl;
for (int i = 0; i < m; i++) {
cout << x[i] << ' ' << y[i] << nl;
}
ioi
assert(0);
}
}
}
#endif
컴파일 시 표준 에러 (stderr) 메시지
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:87:7: warning: declaration of 'x' shadows a global declaration [-Wshadow]
int x = *st.begin();
^
sorting.cpp:30:23: note: shadowed declaration is here
int a[MAXN], b[MAXN], x[MAXN], y[MAXN];
^
sorting.cpp:95:30: warning: conversion to 'int' from 'long int' may alter its value [-Wconversion]
int p1 = find(a, a + n, x) - a;
~~~~~~~~~~~~~~~~~~^~~
sorting.cpp:98:32: warning: conversion to 'int' from 'long int' may alter its value [-Wconversion]
int p2 = find(a, a + n, i) - a;
~~~~~~~~~~~~~~~~~~^~~
# | 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... |