Official
E - 山の見晴らし / Mountain View Editorial
by
E - 山の見晴らし / Mountain View Editorial
by
kyopro_friends
問題文の指示通り愚直に計算しようとすると \(\Theta(N^2)\) となり、実行時間制限に間に合わせるのは困難です。
\((A_1,\ldots,A_N)\) をソートした数列を \(B=(B_1,\ldots,B_N)\) とします。「\(B\) のうち \(X\) より大きな要素は何個あるか?」という質問には二分探索により \(O(\log N)\) で答えることができます。この質問を 各 \(A_i\) について行うことで、\(O(N\log N)\) で答えを求めることができます。
実装例 (C++)
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
cin >> n;
vector<int> a(n);
for(int i=0; i<n; i++) cin >> a[i];
vector<int> b=a;
sort(b.begin(), b.end());
for(int i=0; i<n; i++){
int ans = b.end() - upper_bound(b.begin(), b.end(), a[i]);
cout << ans << endl;
}
}
実装例 (Python)
import bisect
N = int(input())
A = list(map(int, input().split()))
B = sorted(A)
for a in A:
ans = N - bisect.bisect_right(B, a)
print(ans)
posted:
last update:
