제출 #1349722

#제출 시각아이디문제언어결과실행 시간메모리
1349722GabrielA String Problem (EGOI25_stringproblem)C++20
100 / 100
180 ms25740 KiB
#include "bits/stdc++.h"
using namespace std;
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n;
    cin>>n;
    map<int, int> Puntaje;
    vector< pair<int, int> > Pares(n);
    for(int i = 0; i < n; i++){
        cin>>Pares[i].first>>Pares[i].second;
        Puntaje[(Pares[i].first + Pares[i].second) % (2 * n)]++;
    }
    int Mayor = -2, Valor = -2, Tiempo = n;
    for(int i = 1; i < n * 2; i += 2){
        if(Puntaje[i] > Mayor){
            Mayor = Puntaje[i];
            Valor = i;
            Tiempo = n - Puntaje[i];
        }
    }
    //cerr<<Valor<<"\n";
    vector<int> Pares_posibles(2 * n, -2);
    int A_adir = Valor;
    for(int i = 0; i < n * 2; i++){
        //cerr<<i<<" "<<A_adir<<"\n";
        Pares_posibles[i] = A_adir;
        A_adir--;
        if(A_adir < 0) A_adir = n * 2 - 1;
    }
    cout<<Tiempo<<"\n";
    set< pair< pair<int, int>, int > > Considerar;
    for(int i = 0; i < n; i++){
        if(Pares_posibles[Pares[i].first] == Pares[i].second){
            Pares_posibles[Pares[i].first] = -2;
            Pares_posibles[Pares[i].second] = -2;
            continue;
        }
        Considerar.insert({Pares[i], i});
        swap(Pares[i].first, Pares[i].second);
        Considerar.insert({Pares[i], i});
    }
    /*cerr<<"\nPares posibles:\n";
    for(auto E: Pares_posibles){
        cerr<<E<<" ";
    }
    cerr<<"\n";*/
    if(Tiempo == 0) return 0;
    for(auto E = Considerar.begin(); !Considerar.empty(); ){
        int i = E->second, Extremo0 = E->first.first, Extremo1 = E->first.second, Extremo2 = Pares_posibles[Extremo0];
        /*cerr<<"Pares posibles:\n";
        for(auto E: Pares_posibles){
            cerr<<E<<" ";
        }
        cerr<<"\n";*/
        if(Extremo2 == -2){
            swap(Extremo0, Extremo1);
            Extremo2 = Pares_posibles[Extremo0];
        }
        //cerr<<Extremo0<<" "<<Extremo1<<" "<<Extremo2<<" "<<i<<" Dato.\n";
        cout<<i<<" "<<Extremo1<<" "<<Extremo2<<"\n";
        Pares_posibles[Extremo0] = -2;
        Pares_posibles[Extremo2] = -2;
        Considerar.erase({{Extremo0, Extremo1}, i});
        Considerar.erase({{Extremo1, Extremo0}, i});
        /*for(auto ss: Considerar){
            cerr<<ss.first.first<<" "<<ss.first.second<<" "<<ss.second<<" Queda.\n";
        }*/
        E = Considerar.lower_bound({{Extremo2, -2}, -2});
        if(E == Considerar.end()) E = Considerar.begin();
    }
    return 0;
}
#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...