Submission #885851

#TimeUsernameProblemLanguageResultExecution timeMemory
885851JakobZorz정렬하기 (IOI15_sorting)C++17
74 / 100
1025 ms15956 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);
    for(int i=0;i<n;i++){
        perm[i]=i;
        inv_perm[i]=i;
        curr[i]=s[i];
    }
    
    for(int i=0;i<m;i++)
        swap(curr[x[i]],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]]]);
    }
    
    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]]]);
        
        for(int j=0;j<n;j++){
            if(curr[j]!=j){
                ans[i].first=inv_perm[j];
                for(int k=0;k<n;k++){
                    if(curr[k]==j){
                        swap(curr[j],curr[k]);
                        ans[i].second=inv_perm[k];
                        break;
                    }
                }
                break;
            }
        }
    }
    
    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;
    }
    
    /*vector<int>test(n);
    for(int i=0;i<n;i++)
        test[i]=s[i];
    
    for(int i=0;i<opt;i++){
        swap(test[x[i]],test[y[i]]);
        swap(test[P[i]],test[Q[i]]);
        bool sorted=true;
        for(int j=0;j<n;j++)
            if(test[j]!=j)
                sorted=false;
        if(sorted)
            return i+1;
    }
    
#ifdef JAKOB
    for(int i:test)
        cout<<i<<" ";
    cout<<"\n";
#endif*/
	return opt;
}


Compilation message (stderr)

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:52:37: warning: unused parameter '_' [-Wunused-parameter]
   52 | 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...