m (≤100,000) 個球,每球有編號 (0~100,000,000)。n (≤1,000,000) 次查詢,每次給編號 k,判斷是否存在。輸出 YES/NO。
m 較大,線性查找 O(mn) 超時。預處理排序 O(m log m),每次查詢 O(log m),總複雜度 O((m+n) log m)。
#include <stdio.h>
#include <stdlib.h>
int s[1000005];
int low, high;
int cmp(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int binary_search(int x) {
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (s[mid] == x) return 1;
else if (s[mid] < x) low = mid + 1;
else high = mid - 1;
}
return 0;
}
int main() {
int i, m, n, a;
scanf("%d%d", &m, &n);
for (i = 0; i < m; i++) scanf("%d", &s[i]);
qsort(s, m, sizeof(int), cmp);
while (n--) {
low = 0; high = m - 1;
scanf("%d", &a);
printf(binary_search(a) ? "YES\n" : "NO\n");
}
return 0;
}
std::binary_search 或 std::unordered_set (O(1) 平均查找)fast I/O (scanf/printf 或 ios::sync_with_stdio(false))輸入:6 4 / 23 34 46 768 343 343 / 2 4 23 343
排序後:23 34 46 343 343 768
查詢:2→NO, 4→NO, 23→YES, 343→YES