x, yの表を見た感じだと範囲の隙間は無いようなので、x, yそれぞれについて二分探索して
テーブル参照するのが一番簡単じゃないですかね。
100x600だと表データを作るのは大変そうですが、探索速度はそれほど悪くないはずです。
python
1from bisect import bisect_right
2
3def solve(x, y, val_dic, ys, xs):
4 y_pos = bisect_right(ys, y)
5 x_pos = bisect_right(xs, x)
6 return val_dic.get((x_pos, y_pos), -1)
7
8
9# 表の内容に基づいて、あらかじめ用意しておくデータ
10table = [
11 [10, 9, 6, 2, 1],
12 [10, 9, 7, 3, 2],
13 [9, 8, 7, 5, 3],
14 [7, 6, 5, 3, 1]
15]
16# tableを(x, y)をキーにした辞書でアクセスできるように変換
17val_dic = {(x, y): val for y, row in enumerate(table, start=1) for x, val in enumerate(row, start=1)}
18
19ys = [200, 500, 1000, 5000, 30000]
20xs = [0.5, 2.0, 5.0, 10.0, 20.0, 50.0]
21
22
23# 動作チェック
24data = [(1, 200, 10), (2.5, 1500, 8), (3.0, 29999, 6), (7, 200, 6), (20, 500, 2), (49, 25000, 1),
25 (5.0, 29800, 5), (19.999, 5000, 3), (0.5, 1000, 9), (4.9999, 4999.9, 8), (0.51, 200.1, 10),
26 (0.49, 1500, -1), (5, 30000, -1), (0, 0, -1), (10**100, 2**342, -1), (-1, -1, -1)]
27for x, y, exp in data:
28 res = solve(x, y, val_dic, ys, xs)
29 assert res == exp, f'x, y = {x}, {y} -> {res} != {exp}'