제출 #669778

#제출 시각아이디문제언어결과실행 시간메모리
669778alvingogoSorting (IOI15_sorting)C++14
100 / 100
496 ms24864 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

int n;
void print(vector<int> s){
    for(int i=0;i<n;i++){
        cout << s[i] << " ";
    }
    cout << "\n";
}
void print2(int s[]){
    for(int i=0;i<n;i++){
        cout << s[i] << " ";
    }
    cout << "\n";
}
int findSwapPairs(int N,int S[],int M,int X[],int Y[],int P[],int Q[]){
    int l=0,r=M;
    n=N;
    while(r>l){
        int m=(l+r)/2;
        vector<int> v(n);
        iota(v.begin(),v.end(),0);
        for(int i=0;i<m;i++){
            swap(v[X[i]],v[Y[i]]);
        }
        vector<int> g(n);
        for(int i=0;i<n;i++){
            g[v[i]]=i;
        }
        v=g;
        for(int i=0;i<n;i++){
            g[v[i]]=S[i];
        }
        vector<int> vis(n);
        int cnt=0;
        for(int i=0;i<n;i++){
            if(!vis[i]){
                cnt++;
                vis[i]=1;
                int a=i;
                while(1){
                    a=g[a];
                    if(vis[a]){
                        break;
                    }
                    vis[a]=1;
                }
            }
        }
        int t=n-cnt;
        if(t<=m){
            r=m;
        }
        else{
            l=m+1;
        }
    }
    vector<int> v(n);
    iota(v.begin(),v.end(),0);
    for(int i=0;i<l;i++){
        swap(v[X[i]],v[Y[i]]);
    }
    vector<int> g(n);
    for(int i=0;i<n;i++){
        g[v[i]]=i;
    }
    v=g;
    vector<int> d(n),e(n);
    for(int i=0;i<n;i++){
        d[S[i]]=i;
        e[v[i]]=i;
    }
    vector<int> vis(n);
    int c=0,cn=0;
    set<int> u;
    for(int i=0;i<n;i++){
        if(v[i]!=S[i]){
            u.insert(i);
        }
    }
    for(int i=0;i<l;i++){
        {
            int t=X[i],f=Y[i];
            swap(d[S[t]],d[S[f]]);
            swap(S[t],S[f]);
            swap(e[v[t]],e[v[f]]);
            swap(v[t],v[f]);
            if(v[t]!=S[t]){
                u.insert(t);
            }
            else{
                u.erase(t);
            }
            if(v[f]!=S[f]){
                u.insert(f);
            }
            else{
                u.erase(f);
            }
        }
        if(!u.size()){
            continue;
        }
        auto cn=*u.begin();
        u.erase(cn);
        assert(v[cn]!=S[cn]);
        if(v[cn]!=S[cn]){
            int t=cn,f=d[v[cn]];
            swap(d[S[t]],d[S[f]]);
            swap(S[t],S[f]);
            if(v[t]!=S[t]){
                u.insert(t);
            }
            else{
                u.erase(t);
            }
            if(v[f]!=S[f]){
                u.insert(f);
            }
            else{
                u.erase(f);
            }
            P[c]=t;
            Q[c]=f;
            c++;  
        }
    }
    if(c<l){
        P[c]=Q[c]=0;
        c++;
    }
    return l;
}

/*
int main(){
    int N, M;
    cin >> N;
	int *S = (int*)malloc(sizeof(int) * (unsigned int)N);
	for (int i = 0; i < N; ++i)
		cin >> S[i];
	cin >> M;
	int *X = (int*)malloc(sizeof(int) * (unsigned int)M), *Y = (int*)malloc(sizeof(int) * (unsigned int)M);
	for (int i = 0; i < M; ++i) {
	    cin >> X[i];
        cin >> Y[i];
	}
	int *P = (int*)malloc(sizeof(int) * (unsigned int)M), *Q = (int*)malloc(sizeof(int) * (unsigned int)M);
	int ans = findSwapPairs(N, S, M, X, Y, P, Q);
	cout << ans << "\n";
	for (int i = 0; i < ans; ++i)
		cout << P[i] << " " << Q[i] << "\n";
    return 0;
}
*/

컴파일 시 표준 에러 (stderr) 메시지

sorting.cpp: In function 'int findSwapPairs(int, int*, int, int*, int*, int*, int*)':
sorting.cpp:110:14: warning: declaration of 'cn' shadows a previous local [-Wshadow]
  110 |         auto cn=*u.begin();
      |              ^~
sorting.cpp:80:13: note: shadowed declaration is here
   80 |     int c=0,cn=0;
      |             ^~
sorting.cpp:80:13: warning: unused variable 'cn' [-Wunused-variable]
#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...