# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
448553 | FEDIKUS | 정렬하기 (IOI15_sorting) | C++17 | 200 ms | 22568 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "sorting.h"
#include<bits/stdc++.h>
#define xx first
#define yy second
using namespace std;
typedef pair<int,int> pii;
const int maxn=2e5+10;
int novi[maxn];
bool bio[maxn];
bool moze(int mid,int n,int m,int* s,int* x,int* y){
for(int i=0;i<n;i++) novi[i]=s[i];
for(int i=0;i<mid;i++){
swap(novi[x[i]],novi[y[i]]);
}
int klk=n;
for(int i=0;i<n;i++) bio[i]=false;
for(int i=0;i<n;i++){
if(bio[i]) continue;
klk--;
int tren=novi[i];
while(tren!=i){
bio[tren]=true;
tren=novi[tren];
}
}
return klk<=mid;
}
void swapovi(vector<int> niz,vector<pii> &svi){
for(int i=0;i<niz.size()-1;i++){
svi.push_back(make_pair(niz[i],niz[i+1]));
}
}
int gde[maxn];
vector<pii> popravi(int n,int naj,int* s,int* x,int* y,vector<pii> svi){
for(int i=0;i<n;i++) novi[i]=s[i];
for(int i=0;i<n;i++) gde[novi[i]]=i;
vector<pii> ret;
for(int i=0;i<naj;i++){
swap(novi[x[i]],novi[y[i]]);
gde[novi[x[i]]]=x[i];
gde[novi[y[i]]]=y[i];
if(i<svi.size()){
ret.push_back(make_pair(gde[svi[i].xx],gde[svi[i].yy]));
int prvi=gde[svi[i].xx];
int drugi=gde[svi[i].yy];
swap(novi[prvi],novi[drugi]);
gde[novi[prvi]]=prvi;
gde[novi[drugi]]=drugi;
}else ret.push_back(make_pair(0,0));
}
return ret;
}
void nadji(int naj,int n,int m,int* s,int* x,int* y,int* p,int* q){
for(int i=0;i<n;i++) novi[i]=s[i];
for(int i=0;i<naj;i++) swap(novi[x[i]],novi[y[i]]);
int klk=n;
for(int i=0;i<n;i++) bio[i]=false;
vector<pii> svi;
for(int i=0;i<n;i++){
if(bio[i]) continue;
vector<int> sada;
klk--;
int tren=novi[i];
sada.push_back(i);
while(tren!=i){
sada.push_back(tren);
bio[tren]=true;
tren=novi[tren];
}
swapovi(sada,svi);
}
///
vector<pii> res=popravi(n,naj,s,x,y,svi);
for(int i=0;i<res.size();i++){
p[i]=res[i].xx;
q[i]=res[i].yy;
}
}
int findSwapPairs(int n, int s[], int m, int x[], int y[], int p[], int q[]) {
int l=0;
int r=m;
int naj=-1;
while(l<=r){
int mid=l+(r-l)/2;
if(moze(mid,n,m,s,x,y)){
naj=mid;
r=mid-1;
}else l=mid+1;
}
nadji(naj,n,m,s,x,y,p,q);
return naj;
}
컴파일 시 표준 에러 (stderr) 메시지
# | 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... |