답안 #452143

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
452143 2021-08-03T22:30:43 Z PedroBigMan 정렬하기 (IOI15_sorting) C++14
0 / 100
2 ms 460 KB
#include "sorting.h"
/*
Author of all code: Pedro BIGMAN Dias
Last edit: 15/02/2021
*/
#pragma GCC optimization ("O3")
#pragma GCC optimization ("unroll-loops")
#pragma GCC optimize("Ofast")
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <string>
#include <map>
#include <unordered_map>
#include <set>
#include <unordered_set>
#include <queue>
#include <deque>
#include <list>
#include <iomanip>
#include <stdlib.h>
#include <time.h>
#include <cstring>
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
typedef long double ld;
#define REP(i,a,b) for(ll i=(ll) a; i<(ll) b; i++)
#define pb push_back
#define mp make_pair
#define pl pair<ll,ll>
#define ff first
#define ss second
#define whole(x) x.begin(),x.end()
#define DEBUG(i) cout<<"Pedro Is The Master "<<i<<endl
#define INF 500000000LL
#define EPS 0.00000001
#define pi 3.14159
ll mod=1000000007LL;

template<class A=ll> 
void Out(vector<A> a) {REP(i,0,a.size()) {cout<<a[i]<<" ";} cout<<endl;}

template<class A=ll>
void In(vector<A> &a, ll N) {A cur; REP(i,0,N) {cin>>cur; a.pb(cur);}} 

vector<vector<ll> > CycleDecomp(vector<ll> p) //cycle decomposition of permutation
{
	ll N = p.size(); vector<vector<ll> > ans; vector<ll> cur;
	vector<bool> visited; REP(i,0,N) {visited.pb(false);} 
	ll node;
	REP(i,0,N)
	{
		if(visited[i]) {continue;}
		node=i; cur.pb(node); node=p[node];
		while(node!=i)
		{
			cur.pb(node); node=p[node];
		}
		reverse(whole(cur)); REP(i,0,cur.size()) {visited[cur[i]]=true;}
		ans.pb(cur);
		cur.clear();
	}
	return ans;
}

int findSwapPairs(int N, int S[], int M, int X[], int Y[], int P[], int Q[]) 
{
    vector<ll> p; REP(i,0,N) {p.pb(i);}
	ll lo=0; ll hi=M; ll mid; ll R;
	while(lo<hi)
	{
		mid=(hi+lo)/2;
		REP(i,0,N) {p[i]=S[i];}
		REP(i,0,mid) {swap(p[X[i]],p[Y[i]]);}
		ll trans = N-CycleDecomp(p).size();
		if(trans<=mid) {hi=mid;} else {lo=mid+1;}
	}
	R=lo;
	REP(i,0,N) {p[i]=S[i];}
	REP(i,0,R) {swap(p[X[i]],p[Y[i]]);}
	vector<vector<ll> > cycles = CycleDecomp(p);
	vector<pl> swa; 
	REP(i,0,cycles.size()) 
	{
		REP(j,0,cycles[i].size()-1) {swa.pb({cycles[i][j],cycles[i][j+1]});}
	}
	REP(i,0,N) {p[i]=S[i];}
	vector<ll> pos; REP(i,0,N) {pos.pb(0LL);}
	REP(i,0,N) {pos[p[i]]=i;}
	REP(i,0,swa.size())
	{
		pos[p[X[i]]]=Y[i]; pos[p[Y[i]]]=X[i];
		swap(p[X[i]],p[Y[i]]);
		P[i]=pos[swa[i].ff]; Q[i]=pos[swa[i].ss];
		swap(pos[swa[i].ff],pos[swa[i].ss]); swap(p[P[i]],p[Q[i]]);
	}
	REP(i,swa.size(),R) {P[i]=0LL; Q[i]=0LL;}
	return R;
}


Compilation message

sorting.cpp:6: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    6 | #pragma GCC optimization ("O3")
      | 
sorting.cpp:7: warning: ignoring '#pragma GCC optimization' [-Wunknown-pragmas]
    7 | #pragma GCC optimization ("unroll-loops")
      | 
sorting.cpp: In function 'std::vector<std::vector<long long int> > CycleDecomp(std::vector<long long int>)':
sorting.cpp:61:28: warning: declaration of 'i' shadows a previous local [-Wshadow]
   61 |   reverse(whole(cur)); REP(i,0,cur.size()) {visited[cur[i]]=true;}
      |                            ^
sorting.cpp:29:27: note: in definition of macro 'REP'
   29 | #define REP(i,a,b) for(ll i=(ll) a; i<(ll) b; i++)
      |                           ^
sorting.cpp:53:6: note: shadowed declaration is here
   53 |  REP(i,0,N)
      |      ^
sorting.cpp:29:27: note: in definition of macro 'REP'
   29 | #define REP(i,a,b) for(ll i=(ll) a; i<(ll) b; i++)
      |                           ^
sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:96:21: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
   96 |   P[i]=pos[swa[i].ff]; Q[i]=pos[swa[i].ss];
      |                     ^
sorting.cpp:96:42: warning: conversion from '__gnu_cxx::__alloc_traits<std::allocator<long long int>, long long int>::value_type' {aka 'long long int'} to 'int' may change value [-Wconversion]
   96 |   P[i]=pos[swa[i].ff]; Q[i]=pos[swa[i].ss];
      |                                          ^
sorting.cpp:100:9: warning: conversion from 'll' {aka 'long long int'} to 'int' may change value [-Wconversion]
  100 |  return R;
      |         ^
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 1 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 1 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Incorrect 0 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 204 KB Output is correct
3 Correct 1 ms 204 KB Output is correct
4 Correct 0 ms 204 KB Output is correct
5 Incorrect 1 ms 204 KB Output isn't correct
6 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 460 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 460 KB Output isn't correct
2 Halted 0 ms 0 KB -