This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for(long long i=0;i<(long long)(n);i++)
#define REP(i,k,n) for(long long i=k;i<(long long)(n);i++)
#define all(a) a.begin(),a.end()
#define rsort(a) {sort(all(a));reverse(all(a));}
#define pb emplace_back
#define eb emplace_back
#define lb(v,k) (lower_bound(all(v),(k))-v.begin())
#define ub(v,k) (upper_bound(all(v),(k))-v.begin())
#define fi first
#define se second
#define pi M_PI
#define PQ(T) priority_queue<T>
#define SPQ(T) priority_queue<T,vector<T>,greater<T>>
#define dame(a) {out(a);return 0;}
#define decimal cout<<fixed<<setprecision(15);
#define dupli(a) {sort(all(a));a.erase(unique(all(a)),a.end());}
typedef long long ll;
template<class T> void outv(T v){rep(i,v.size()){if(i)cout<<' ';cout<<v[i];}cout<<'\n';}
using vi=vector<ll>;
using vb=vector<bool>;
#include "sorting.h"
int findSwapPairs(int n,int s[],int m,int x[],int y[],int P[],int Q[]){
int ok=m+1,ng=-1;
rep(i,m)P[i]=Q[i]=0;
while(ok-ng>1){
ll md=(ok+ng)/2;
vi v(n);
rep(i,n)v[i]=s[i];
rep(i,md)swap(v[x[i]],v[y[i]]);
vb used(n,false);
ll ans=n;
rep(i,n)if(!used[i]){
ans--;
ll w=i;
used[w]=true;
while(!used[v[w]]){
used[v[w]]=true;
w=v[w];
}
}
if(ans>md)ng=md;
else ok=md;
}
vi v(n);
rep(i,n)v[i]=s[i];
rep(i,ok)swap(v[x[i]],v[y[i]]);
vi target(n);rep(i,n)target[i]=i;
vi rev(n);
rep(i,n)rev[v[i]]=i;
set<ll> yet;
rep(i,n)if(v[i]!=target[i])yet.insert(v[i]);
for(int i=ok-1;i>=0;i--){
if(yet.size()){
ll w=rev[*yet.begin()];
if(v[w]==target[w]){
yet.erase(yet.begin());
i++;continue;
}
ll t=rev[target[w]];yet.erase(target[w]);
P[i]=t;Q[i]=w;
swap(target[t],target[w]);
}
swap(rev[v[x[i]]],rev[v[y[i]]]);
swap(target[x[i]],target[y[i]]);swap(v[x[i]],v[y[i]]);
}
return ok;
}/*
int main(){
int n;cin>>n;
int s[10];rep(i,n)cin>>s[i];
int m;cin>>m;
int x[10],y[10];
rep(i,m)cin>>x[i]>>y[i];
int p[10],q[10];
out(findSwapPairs(n,s,m,x,y,p,q));
rep(i,m)outp(P(p[i],q[i]));
rep(i,m){
swap(s[x[i]],s[y[i]]);
swap(s[p[i]],s[q[i]]);
}
rep(i,n)cout<<s[i]<<' ';cout<<endl;
}*/
Compilation message (stderr)
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:43:22: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
43 | if(ans>md)ng=md;
| ^~
sorting.cpp:44:17: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
44 | else ok=md;
| ^~
sorting.cpp:62:18: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
62 | P[i]=t;Q[i]=w;
| ^
sorting.cpp:62:25: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
62 | P[i]=t;Q[i]=w;
| ^
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |