公式

D - 試験/Examination 解説 by mechanicalpenciI


基本的な方針としてはそれぞれの生徒について \((A[i]+B[i],A[i],i)\) を組にして、適切な比較関数を用いてソートすることで答えが得られます。自分で比較関数を用意しても良いですが、複数キーによるソートが標準ライブラリとして用意されていることも多いので、それらを使っても良いです。c++ であれば tuple, Python であれば list でソート時にキーを指定することで出来ます。

多くの場合ソートの向きはデフォルトで昇順となっているので、値の持ち方を \((-(A[i]+B[i]),-A[i],i)\) とするとそのまま用いることができます。

計算量は\(O(N\log N)\) なので十分高速です。また、\(A[i]+B[i]\leq 2\times 10^9<2^{31}\) より、すべて \(32\) bit 整数型で扱って問題ありません。

c++ による実装例 :

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

int main(void) {
	int n;
	int a[200010];
	int b[200010];
	vector<tuple<int, int, int> >score;

	cin >> n;
	for (int i = 0; i < n; i++)cin >> a[i];
	for (int i = 0; i < n; i++)cin >> b[i];

	for (int i = 0; i < n; i++)score.push_back({ -(a[i] + b[i]),-a[i],i+1 });
	sort(score.begin(), score.end());

	for (int i = 0; i < n; i++) {
		cout << get<2>(score[i]);
		if (i < (n - 1))cout << " ";
		else cout << endl;
	}

	return 0;
}

投稿日時:
最終更新: