이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#include "sorting.h"
using namespace std;
const int nmax=2e5+42;
int arr[nmax];
bool been[nmax];
vector< pair<int,int> > change;
int findSwapPairs(int N,int S[],int M,int X[],int Y[],int P[],int Q[])
{
int ok=N,not_ok=-1;
while(ok-not_ok>1)
{
int av=(ok+not_ok)/2;
//test av
for(int j=0;j<N;j++)
arr[j]=S[j];
for(int j=0;j<av;j++)
swap(arr[X[j]],arr[Y[j]]);
memset(been,0,sizeof(been));
int now=0;
for(int i=0;i<N;i++)
if(been[i]==0)
{
int j=i,d=0;
while(been[j]==0)
{
been[j]=1;
d++;
j=arr[j];
}
now=now+d-1;
}
//cout<<av<<" -> "<<now<<endl;
if(now<=av)ok=av;
else not_ok=av;
}
for(int j=0;j<N;j++)
arr[j]=S[j];
for(int j=0;j<ok;j++)
swap(arr[X[j]],arr[Y[j]]);
memset(been,0,sizeof(been));
int now=0;
for(int i=0;i<N;i++)
if(been[i]==0)
{
int j=i,d=0;
while(been[j]==0)
{
been[j]=1;
d++;
j=arr[j];
if(i!=j)change.push_back({min(i,j),max(i,j)});
}
}
//reverse(change.begin(),change.end());
for(int i=0;i<ok;i++)
{
pair<int,int> now=change[i];
for(int j=ok-1;j>i;j--)
{
int a=-1,b=-1,q=-1;
if(X[j]==now.first)a=X[j],b=Y[j],q=now.second;
else if(Y[j]==now.first)a=Y[j],b=X[j],q=now.second;
else if(X[j]==now.second)a=X[j],b=Y[j],q=now.first;
else if(Y[j]==now.second)a=Y[j],b=X[j],q=now.first;
if(a!=-1)now={b,q};
//cout<<"after "<<j<<" step, "<<now.first<<" "<<now.second<<endl;
}
P[i]=now.first;
Q[i]=now.second;
//cout<<i<<" -> "<<now.first<<" "<<now.second<<endl;
}
//test
for(int j=0;j<N;j++)
arr[j]=S[j];
for(int i=0;i<ok;i++)
{
swap(arr[X[i]],arr[Y[i]]);
swap(arr[P[i]],arr[Q[i]]);
//for(int j=0;j<N;j++)cout<<arr[j]<<" ";cout<<endl;
}
for(int i=0;i<N;i++)
if(arr[i]!=i)return -1;
return ok;
}
/*
int n=5;
int S[5]={4,3,2,1,0};
int m=6;
int X[6]={0,1,2,3,0,1};
int Y[6]={1,2,3,4,1,2};
int P[6];
int Q[6];
int main()
{
cout<<findSwapPairs(n,S,m,X,Y,P,Q)<<endl;
}
*/
컴파일 시 표준 에러 (stderr) 메시지
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:64:23: warning: declaration of 'now' shadows a previous local [-Wshadow]
pair<int,int> now=change[i];
^~~
sorting.cpp:45:9: note: shadowed declaration is here
int now=0;
^~~
sorting.cpp:45:9: warning: unused variable 'now' [-Wunused-variable]
sorting.cpp:8:37: warning: unused parameter 'M' [-Wunused-parameter]
int findSwapPairs(int N,int S[],int M,int X[],int Y[],int P[],int Q[])
^
# | 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... |