Submission #621125

#TimeUsernameProblemLanguageResultExecution timeMemory
621125Bench0310Sorting (IOI15_sorting)C++17
100 / 100
245 ms25536 KiB
#include <bits/stdc++.h>
#include "sorting.h"

using namespace std;
typedef long long ll;

int findSwapPairs(int n,int s[],int m,int x[],int y[],int p[],int q[])
{
    auto solve=[&](int mv)->vector<array<int,2>>
    {
        vector<int> f(n,-1);
        for(int i=0;i<n;i++) f[i]=s[i];
        for(int i=0;i<mv;i++) swap(f[x[i]],f[y[i]]);
        vector<bool> vis(n,0);
        vector<array<int,2>> v;
        for(int i=0;i<n;i++)
        {
            if(vis[i]) continue;
            int b=i;
            int a=i;
            while(!vis[a])
            {
                vis[a]=1;
                a=f[a];
                if(!vis[a]) v.push_back({b,a});
            }
        }
        int sz=v.size();
        if(sz<=mv)
        {
            f.assign(n,-1);
            for(int i=0;i<n;i++) f[i]=s[i];
            vector<int> g(n,-1);
            for(int i=0;i<n;i++) g[f[i]]=i;
            vector<array<int,2>> res;
            for(int i=0;i<mv;i++)
            {
                swap(f[x[i]],f[y[i]]);
                swap(g[f[x[i]]],g[f[y[i]]]);
                if(i<sz) res.push_back({g[v[i][0]],g[v[i][1]]});
                else res.push_back({g[0],g[0]});
            }
            return res;
        }
        else return {{-1,-1}};
    };
    int l=-1,r=m;
    while(l<r-1)
    {
        int mv=(l+r)/2;
        auto res=solve(mv);
        if(!(res.size()==1&&res[0][0]==-1)) r=mv;
        else l=mv;
    }
    auto res=solve(r);
    for(int i=0;i<r;i++)
    {
        p[i]=res[i][0];
        q[i]=res[i][1];
    }
    return r;
}

Compilation message (stderr)

sorting.cpp: In lambda function:
sorting.cpp:28:22: warning: conversion from 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   28 |         int sz=v.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...