|
1 | | -/* /dev/stdin */ |
2 | | -let fs = require('fs'); |
3 | | -let input = fs.readFileSync('/dev/stdin').toString().split('\n'); |
| 1 | +// /dev/stdin |
| 2 | +const fs = require("fs"); |
| 3 | +let input = fs |
| 4 | + .readFileSync("/dev/stdin") |
| 5 | + .toString() |
| 6 | + .split("\n") |
| 7 | + .map((x) => x.replace("\r", "")); |
4 | 8 |
|
5 | 9 | const N = Number(input[0]); |
6 | | -const arrN = input[1].split(' ').map(Number); |
| 10 | +const numberCards = input[1].split(" ").map(Number); |
7 | 11 | const M = Number(input[2]); |
8 | | -const arrM = input[3].split(' ').map(Number); |
| 12 | +let myCards = input[3] |
| 13 | + .split(" ") |
| 14 | + .map(Number) |
| 15 | + .sort((a, b) => a - b); |
9 | 16 |
|
10 | | -arrN.sort((a, b) => a - b); |
| 17 | +const maps = new Map(); |
11 | 18 |
|
12 | | -let answer = ''; |
13 | | - |
14 | | -for(let i = 0; i < M; i++){ |
15 | | - const lower = lowerBound(arrN, arrM[i], 0, N); |
16 | | - const upper = upperBound(arrN, arrM[i], 0, N); |
17 | | - |
18 | | - answer += (upper - lower) + ' '; |
| 19 | +for (const key of myCards) { |
| 20 | + maps[key] = 0; |
19 | 21 | } |
20 | 22 |
|
21 | | -console.log(answer) |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
| 23 | +let answer = ""; |
32 | 24 |
|
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | -function lowerBound (arr, target, start, end) { |
39 | | - while(start < end) { |
40 | | - let mid = parseInt((start + end) / 2); |
41 | | - if(arr[mid] >= target) { |
42 | | - end = mid; |
43 | | - } else { |
44 | | - start = mid + 1; |
45 | | - } |
| 25 | +for (const x of numberCards) { |
| 26 | + const result = binarySearch(myCards, x); |
| 27 | + if (result === 1) { |
| 28 | + maps[x]++; |
46 | 29 | } |
47 | | - return end; |
48 | 30 | } |
49 | 31 |
|
| 32 | +function binarySearch(cards, target) { |
| 33 | + let left = 0; |
| 34 | + let right = cards.length - 1; |
50 | 35 |
|
| 36 | + while (left <= right) { |
| 37 | + const mid = Math.floor((left + right) / 2); |
51 | 38 |
|
52 | | - |
53 | | -function upperBound (arr, target, start, end) { |
54 | | - while(start < end) { |
55 | | - let mid = parseInt((start + end) / 2); |
56 | | - if(arr[mid] > target) { |
57 | | - end = mid; |
| 39 | + if (cards[mid] === target) { |
| 40 | + return 1; |
| 41 | + } else if (cards[mid] < target) { |
| 42 | + left = mid + 1; |
58 | 43 | } else { |
59 | | - start = mid + 1; |
| 44 | + right = mid - 1; |
60 | 45 | } |
61 | 46 | } |
62 | | - return end; |
| 47 | + |
| 48 | + return 0; |
63 | 49 | } |
| 50 | +myCards = input[3].split(" ").map(Number); |
| 51 | +for (const number of myCards) { |
| 52 | + answer += maps[number] + " "; |
| 53 | +} |
| 54 | + |
| 55 | +console.log(answer); |
0 commit comments