Official

B - Do you know the second highest mountain? Editorial by penguinman


\(N\) 個の山を (高さ→名前) の順に優先度を付けて降順にソートした後、先頭から \(2\) 番目の山の名前を出力すればいいです。

計算量は \(M\)\((S_i\) の長さの総和\()\) として \(O(M \log N)\) です。

解答例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int N; cin >> N;
    vector<pair<int,string>> data(N);
    for(int i=0; i<N; i++) cin >> data[i].second >> data[i].first;
    sort(data.begin(),data.end(),std::greater{});
    cout << data[1].second << endl;
}

解答例 (Python)

N = int(input())
data = []
for i in range(N):
    S,T = map(str,input().split())
    T = int(T)
    data.append([T,S])
data.sort(reverse=True)
print(data[1][1])

なお、\(1\) 番高い山の情報と \(2\) 番目に高い山の情報を持ち、都度更新していくことで \(O(M)\) で解くことも可能です。

解答例 (C++)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int N; cin >> N;
    vector<string> S(N);
    vector<int> T(N);
    pair<int,string> top,sec;
    top = sec = {0,""};
    for(int i=0; i<N; i++){
        cin >> S[i] >> T[i];
        auto p = make_pair(T[i],S[i]);
        if(top < p){
            sec = top;
            top = p;
        }
        else if(sec < p){
            sec = p;
        }
    }
    cout << sec.second << endl;
}

posted:
last update: