B. Number of Smaller

題目內容

給予兩個陣列,均為已排序遞增陣列,個別長度為 nnmm ,對於第二個陣列的每個元素,找到第一個陣列中,比目前元素小的元素數。

輸入 : 第一行有兩整數 nnmm (1n,m105)(1 \le n, m \le 10^5 ) , 代表兩陣列長度。第二行有 nn 個整數 aia_i ,代表第一個陣列的元素,第三行有 mm 個整數 bib_i ,代表第一個陣列的元素 (109ai,bi109)(−10^9 \le a_i, b_i \le 10^9)

輸出 : 輸出 mm 個數字,代表 bib_i 與第一個陣列中,比 bib_i 小的元素數。

解題想法

本題目是章節中所提到的進階題,尚不了解者可以返回閱讀

在此宣告兩陣列 aa, bb ,個別長度為 nnmm ,並且宣告一變數 nownow ,用於紀錄與第一個陣列中,比目前元素小的元素數。

因此,在走訪 bb 陣列所有元素時,可以利用一 while 迴圈來檢測 anowa_{now} 是否較目前元素小,否則中止此迴圈。

注意

在輸入元素至兩陣列 aabb 後,必須將 ana_n 設置為比最大值還大的值,即 (1×109<an)(1 \times 10^{9} < a_n)

在每次迴圈的最後,都要輸出 now , 代表第一個陣列中,比 bnowb_{now} 小的元素數,並且輸出保持嚴格比對。

範例程式

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

LL n, m, a[200005], b[200005], now = 0;

int main() {
	cin >> n >> m;	
	for (int i = 0; i < n; i++) cin >> a[i]; 
	for (int i = 0; i < m; i++) cin >> b[i];
	a[n] = INT_MAX;	
	for (int i = 0; i < m; i++) {
		while (a[now] < b[i]) now++;
		if (i) cout << ' ';
		cout << now;
	}
	cout << '\n';
	return 0;
}