Harryのブログ

競プロ初心者によるブログです

C - Counting 2

皆さん、こんにちは!

ハリーです。今回はパナソニックプログラミングコンテスト2021(AtCoder Beginner Contest 231) に出題された C - Counting 2 を解いていきたいと思います。私はコンテスト中にこの問題を解くことができなかったので、しっかりと復習していきたいと思います。それでは、解いていきましょう!

 

 

C - Counting 2

問題文

$N$ 人の生徒からなるクラスがあり、$i(1 \leq i \leq N)$ 番目の生徒の身長は $A_i$ です。

$j=1,2,…,Q$ について、以下の質問に答えてください。

制約

  • $1 \leq N, Q \leq 2 × 10^5$
  • $1 \leq A_i \leq 10^9$
  • $1 \leq x_j \leq 10^9$
  • 入力は全て整数

入力例1

3 1
100 160 130
120

出力例1

2

入力例2

5 5
1 2 3 4 5
6
5
4
3
2

出力例2

0
1
2
3
4

入力例3

5 5
804289384 846930887 681692778 714636916 957747794
424238336
719885387
649760493
596516650
189641422

出力例3

5
3
5
5
5

 

実装方法

bisect のモジュールをインポ―トします。

from bisect import bisect_left

入力を受け取り、A の配列を昇順にソートします。

N, Q = map(int, input().split())
A = list(map(int, input().split()))
A.sort()

for 文内で入力 $x$ の値を受け取り、bisect_left で昇順にソートされた配列 A の x 以下の人数を取りだし、全体の人数から x 以下の人数を引いた値を出力します。

for i in range(Q):
  x = int(input())
  print(N - bisect_left(A, x))

 

ACコード

from bisect import bisect_left

N, Q = map(int, input().split())
A = list(map(int, input().split()))
A.sort()

for i in range(Q):
  x = int(input())
  print(N - bisect_left(A, x))

 

おわりに

いかがだったでしょうか?今回の復習で bisect の理解を深めることができたので、良かったです。次も、また別なカテゴリの問題を解いていきたいと思います!

それでは皆さん、また来週!