公式
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;
}
投稿日時:
最終更新: