Submission #1313621

#TimeUsernameProblemLanguageResultExecution timeMemory
1313621activedeltorreSorting (IOI15_sorting)C++20
20 / 100
6 ms10296 KiB
#include "sorting.h"
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int x[200005];
int y[200005];
int vec[200005];
int vec2[200005];
int bila[200005];
int fre[200005];
vector<int>ciclu;
int n;
void dfs(int poz)
{
    if(fre[poz]==1)
    {
        return;
    }
    fre[poz]=1;
    ciclu.push_back(poz);
    dfs(bila[poz]);
}
int vmax=10000000;
set<pair<int,int> >positii[200005];
pair<int,int>getpositions(int timp,int bila1,int bila2)
{
    pair<int,int> r1=*(prev(positii[bila1].upper_bound({timp,vmax})));
    pair<int,int> r2=*(prev(positii[bila2].upper_bound({timp,vmax})));
    swap(positii[bila1],positii[bila2]);
    return make_pair(r1.second,r2.second);
}
vector<pair<int,int> > solutie(int nroper)
{
    vector<pair<int,int>>oper;
    for(int i=0;i<n;i++)
    {
        fre[i]=0;
        vec2[i]=vec[i];
        positii[vec2[i]].insert({0,i});
    }
    for(int i=0;i<nroper;i++)
    {
        positii[vec2[x[i]]].insert({i+1,y[i]});
        positii[vec2[y[i]]].insert({i+1,x[i]});
        swap(vec2[x[i]],vec2[y[i]]);
    }
    for(int i=0;i<n;i++)
    {
        bila[i]=vec2[i];
    }
    for(int i=0;i<n;i++)
    {
        if(fre[i]==0)
        {
            ciclu.clear();
            dfs(i);
            for(int j=1;j<ciclu.size();j++)
            {
                oper.push_back(getpositions(oper.size()+1,ciclu[j-1],ciclu[j]));
                //cout<<ciclu[0]<<" "<<ciclu[j]<<'\n';
                //oper.push_back({ciclu[0],ciclu[j]});
            }
        }
    }
    return oper;
}
int check(int nroper)
{
    for(int i=0;i<n;i++)
    {
        fre[i]=0;
        vec2[i]=vec[i];
    }
    for(int i=0;i<nroper;i++)
    {
        swap(vec2[x[i]],vec2[y[i]]);
    }
    for(int i=0;i<n;i++)
    {
        bila[i]=vec2[i];
    }
    int pasi=0;
    for(int i=0;i<n;i++)
    {
        if(fre[i]==0)
        {
            ciclu.clear();
            dfs(i);
            pasi=pasi+ciclu.size()-1;
        }
    }
    if(pasi<=nroper)
    {
        return 1;
    }
    return 0;
}
int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[])
{
    n=N;
    for(int i=0; i<N; i++)
    {
        vec[i]=S[i];
    }
    for(int i=0; i<M; i++)
    {
        x[i]=X[i];
        y[i]=Y[i];
    }
    int st=0,dr=M;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        if(check(mij)==1)
        {
            dr=mij-1;
        }
        else
        {
            st=mij+1;
        }
    }
    vector<pair<int,int> >rez2=solutie(dr+1);
    for(int i=0;i<rez2.size();i++)
    {
        P[i]=rez2[i].first;
        Q[i]=rez2[i].second;
    }
    return rez2.size();
}
#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...