Submission #349678

#TimeUsernameProblemLanguageResultExecution timeMemory
349678rrrr10000Sorting (IOI15_sorting)C++14
100 / 100
504 ms35560 KiB
#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 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...