No.3021 データベースの練習

レベル : / 実行時間制限 : 1ケース 5.000秒 / メモリ制限 : 512 MB / リアクティブ問題 (詳しくはこちら
タグ : / 解いたユーザー数 46
作問者 : koyumeishikoyumeishi

0 ProblemId : 1332 / 出題時の順位表

Python に標準装備されている SQLite を yukicoder で動かしてみる実験的問題です。 いろいろ不具合があるかも知れません。

問題文

$xy$ 平面上に $n$ 個の点があります。
これらの点は次のような構造で SQLite のデータベースに格納されています。

CREATE TABLE point( id INTEGER PRIMARY KEY, x INTEGER, y INTEGER);
>TABLE point
+----+---+---+
|  id|  x|  y|
+----+---+---+
|   1| x1| y1|
+----+---+---+
|   2| x2| y2|

(略)

|   n| xn| yn|
+----+---+---+
次のようなクエリが $q$ 個与えられるので、これに答えるような SQLite の実行文を出力してください。
  • $x_l \leq x_i \leq x_h , y_l \leq y_i \leq y_h$ であるような点の数を出力せよ

入力

点の情報は開示されませんが、次の制約を満たします。
$1 \leq n \leq 10^3$
$0 \leq x_i \leq 10^9$
$0 \leq y_i \leq 10^9$
点の座標は全て整数で、複数の点が同じ位置に存在することはありません。

$q$
${x_l}_1$ ${x_h}_1$ ${y_l}_1$ ${y_h}_1$
$\vdots$
${x_l}_n$ ${x_h}_n$ ${y_l}_n$ ${y_h}_n$

クエリは次の制約満たします。
$1 \leq q \leq 10^3$
$0 \leq {x_l}_i \leq {x_h}_i \leq 10^9$
$0 \leq {y_l}_i \leq {y_h}_i \leq 10^9$

出力

各クエリ毎 一つのSELECT文を使って下さい。 i 回目のSELECT文の結果が i 回目のクエリの答えとみなされます。
';' を SQL文のセパレータとして使っているので、行末の ';' を忘れないでください。
SELECT文以外も使用可能です。
この問題はリアクティブ問題です。 出力時の flush を忘れないでください。

注) 解答プログラムにクエリの結果は返されません。

サンプル

サンプル1
入力

ジャッジ側の点群が次のような場合の例です。

(3, 2)
(8, 2)
(9, 8)
(3, 1)
(4, 4)
(1, 4)
(0, 4)
(3, 7)
(0, 8)
(7, 2)

与えられるクエリです。

2
6 7 2 7
10 10 10 10
出力

一つ目のクエリ : 6 <= x <= 7, 2 <= y <= 7 であるような点は (7,2) のみなので、 1 が返されるような SELECT文 を出力すれば正解と見なされます。
二つ目のクエリ : (10, 10) は点群に存在しないので、 0 が返されるような SELECT文 を出力すれば正解と見なされます。

SELECT count(*) FROM point WHERE x=7 AND y=2;
SELECT count(*) FROM point WHERE x=10 AND y=10;

実際に点群は開示されないので、もう少し工夫しましょう。

提出ページヘ