Submission #1219323

#TimeUsernameProblemLanguageResultExecution timeMemory
1219323LeonidCukSorting (IOI15_sorting)C++20
100 / 100
93 ms13020 KiB
#include <bits/stdc++.h>
//#include "sorting.h"
using namespace std;
int vrni(vector<int>v,vector<pair<int,int>>&g,int m)
{
    int n=v.size(),sum=0;
    for(int i=0;i<m;i++)
    {
        swap(v[g[i].first],v[g[i].second]);
    }
    vector<bool>vis(n);
    for(int i=0;i<n;i++)
    {
        if(vis[i])continue;
        sum++;
        int a=i;
        vis[i]=true;
        while(v[a]!=i)
        {
            vis[v[a]]=true;
            a=v[a];
        }
    }
    return n-sum;
}
int findSwapPairs(int n, int S[], int m, int X[], int Y[], int P[], int Q[])
{
    int l=0,r=n;
    vector<pair<int,int>>g,res1;
    vector<int>v,v2(n);
    for(int i=0;i<n;i++)
    {
        v2[S[i]]=i;
        v.push_back(S[i]);
        g.push_back({X[i],Y[i]});
    }
    while(l<r)
    {
        int m=(l+r)/2,a=vrni(v,g,m);
        if(a<=m)r=m;
        else l=m+1;
    }
    vector<int>v1=v;
    for(int i=0;i<l;i++)
    {
        swap(v1[g[i].first],v1[g[i].second]);
    }
    vector<bool>vis(n);
    for(int i=0;i<n;i++)
    {
        if(vis[i])continue;
        int a=i;
        vis[i]=true;
        while(v1[a]!=i)
        {
            vis[v1[a]]=true;
            res1.push_back({a,v1[a]});
            a=v1[a];
        }
    }
    for(int i=0;i<l;i++)
    {
        int a=g[i].first,b=g[i].second;
        swap(v2[v[a]],v2[v[b]]);
        swap(v[a],v[b]);
        P[i]=v2[res1[i].first];
        Q[i]=v2[res1[i].second];
        a=P[i];b=Q[i];
        swap(v2[v[a]],v2[v[b]]);
        swap(v[a],v[b]);
    }
    return l;
}
#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...