Official

B - Booby Prize Editorial by kyopro_friends


\(A_i\) を降順にソートして \(2\) 番目の値がもともとあった位置が答えです。ソートした後に元の位置を得るには、 \(A_i\) をソートする代わりに \((A_i,i)\) というタプルをソートすればよいです。

実装例(C++)

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

int main(){
	int n;
	cin >> n;
	vector<pair<int,int>>v;
	for(int i=0;i<n;i++){
		int a;
		cin >> a;
		v.push_back(make_pair(a,i+1));
	}
	sort(v.begin(),v.end(),greater<pair<int,int>>());
	
	cout << v[1].second << endl;
}

実装例(Python)

N=int(input())
A=list(map(int,input().split()))
v=[]

for i in range(N):
	v.append((A[i],i+1))

v.sort()
v.reverse()
print(v[1][1])

別解として、前から順に大きい方の値2つとその位置を保持しておくことで、ソートすることなく \(O(N)\) で解くこともできます。(挿入ソートの先頭2つだけを持っておくイメージです)

実装例(Python)

N=int(input())
A=list(map(int,input().split()))

M1,M2=(0,0),(0,0)
for i in range(N):
	X=(A[i],i+1)
	if X>M1:
		M2=M1
		M1=X
	elif X>M2:
		M2=X

print(M2[1])

posted:
last update: