TOJ 55

TOJ 55

題目

https://toj.tfcis.org/oj/pro/55/

輸入 $n$ 個數字,接下來有 $m$ 筆詢問,想知道詢問的數字 $q$ 在序列當中出現的次數

想法

直接計算 upper_bound ($>q$ 的第一個位置) - lower_bound ($\leq q$ 的第一個位置)

因為這一題的輸入數量有點大,需要加上輸入優化

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//By Koios1143
#include<iostream>
#include<algorithm>
using namespace std;
int n, m, arr[1000010];
int main(){
// 輸入優化
ios::sync_with_stdio(false);
cin.tie(0);

cin>>n;
for(int i=0 ; i<n ; i++){
cin>>arr[i];
}
sort(arr, arr+n);
cin>>m;
for(int i=0, q ; i<m ; i++){
cin>>q;
cout<<upper_bound(arr, arr+n, q) - lower_bound(arr, arr+n, q)<<"\n";
}
return 0;
}

時間複雜度分析

輸入時間複雜度為 $O(n)$

排序時間複雜度為 $O(nlogn)$

二分搜時間複雜度為 $O(logn)$

總時間複雜度約為 $O(n + nlogn)$