제출 #885853

#제출 시각아이디문제언어결과실행 시간메모리
885853JakobZorz정렬하기 (IOI15_sorting)C++17
100 / 100
189 ms21772 KiB
#include"sorting.h"
#include<iostream>
#include<vector>
using namespace std;

int n;
int*x,*y,*s;

vector<pair<int,int>>construct(int m){
    vector<pair<int,int>>ans(m);
    vector<int>perm(n),curr(n),inv_perm(n),inv_curr(n);
    for(int i=0;i<n;i++){
        perm[i]=i;
        inv_perm[i]=i;
        curr[i]=s[i];
        inv_curr[curr[i]]=i;
    }
    
    for(int i=0;i<m;i++){
        swap(curr[x[i]],curr[y[i]]);
        swap(inv_curr[curr[x[i]]],inv_curr[curr[y[i]]]);
    }
    
    for(int i=m-1;i>=0;i--){
        swap(perm[x[i]],perm[y[i]]);
        swap(inv_perm[perm[x[i]]],inv_perm[perm[y[i]]]);
    }
    
    int fi=0;
    for(int i=0;i<m;i++){
        swap(perm[x[i]],perm[y[i]]);
        swap(inv_perm[perm[x[i]]],inv_perm[perm[y[i]]]);
        
        while(fi<n&&curr[fi]==fi)
            fi++;
        
        
        if(fi!=n){
            ans[i].first=inv_perm[fi];
            int k=inv_curr[fi];
            swap(curr[fi],curr[k]);
            swap(inv_curr[curr[fi]],inv_curr[curr[k]]);
            ans[i].second=inv_perm[k];
        }
    }
    
    for(int i=0;i<n;i++)
        if(curr[i]!=i)
            return {};
    
    return ans;
}

int findSwapPairs(int N,int S[],int _,int X[],int Y[],int P[],int Q[]){
    n=N;
    x=X;
    y=Y;
    s=S;
    bool already_done=true;
    for(int i=0;i<n;i++)
        if(s[i]!=i)
            already_done=false;
    if(already_done)
        return 0;
    
    int l=0,r=n;
    while(l<r-1){
        int mid=(l+r)/2;
        if(construct(mid).empty())
            l=mid;
        else
            r=mid;
    }
    int opt=r;
    
    vector<pair<int,int>>res=construct(opt);
    
    for(int i=0;i<opt;i++){
        P[i]=res[i].first;
        Q[i]=res[i].second;
    }
    
	return opt;
}


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

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:54:37: warning: unused parameter '_' [-Wunused-parameter]
   54 | int findSwapPairs(int N,int S[],int _,int X[],int Y[],int P[],int Q[]){
      |                                 ~~~~^
#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...