結果
| 問題 |
No.3207 Digital Font
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-22 17:52:21 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 4,514 bytes |
| コンパイル時間 | 365 ms |
| コンパイル使用メモリ | 82,656 KB |
| 実行使用メモリ | 849,524 KB |
| 最終ジャッジ日時 | 2025-07-22 17:52:29 |
| 合計ジャッジ時間 | 4,462 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | MLE * 1 -- * 37 |
ソースコード
# Generated By Gemini 2.5 Pro
import sys
# 再帰回数の上限を増やす
sys.setrecursionlimit(2 * 10**5 + 5)
# 高速な入力
readline = sys.stdin.readline
class FenwickTree2D:
"""2次元Fenwickツリー(BIT)"""
def __init__(self, h, w):
self.h = h
self.w = w
self.data = [[0] * (w + 1) for _ in range(h + 1)]
def add(self, r, c, x):
r += 1
c += 1
while r <= self.h:
nc = c
while nc <= self.w:
self.data[r][nc] += x
nc += nc & -nc
r += r & -r
def _query(self, r, c):
r += 1
c += 1
s = 0
while r > 0:
nc = c
while nc > 0:
s += self.data[r][nc]
nc -= nc & -nc
r -= r & -r
return s
def query(self, r1, c1, r2, c2):
"""長方形領域 [r1, r2] x [c1, c2] の和を求める"""
return self._query(r2, c2) - self._query(r1 - 1, c2) - self._query(r2, c1 - 1) + self._query(r1 - 1, c1 - 1)
def solve():
H, W = map(int, readline().split())
N = int(readline())
points = [list(map(int, readline().split())) for _ in range(N)]
Q = int(readline())
queries = [list(map(int, readline().split())) for _ in range(Q)]
# --- 座標圧縮 ---
all_rows = sorted(list(set([p[0] for p in points] + [q[0] for q in queries] + [q[2] for q in queries])))
all_cols = sorted(list(set([p[1] for p in points] + [q[1] for q in queries] + [q[3] for q in queries])))
row_map = {val: i for i, val in enumerate(all_rows)}
col_map = {val: i for i, val in enumerate(all_cols)}
compressed_h = len(all_rows)
compressed_w = len(all_cols)
# --- ハッシュの準備 ---
MOD1, MOD2 = 10**9 + 7, 10**9 + 9
P1, P2 = 37, 41
# P1, P2のべき乗とモジュラ逆数を事前計算
max_coord = max(H, W) * 2 + 1
pow1_1 = [1] * (max_coord + 1)
pow2_1 = [1] * (max_coord + 1)
inv1_1 = [1] * (max_coord + 1)
inv2_1 = [1] * (max_coord + 1)
P1_inv1 = pow(P1, MOD1 - 2, MOD1)
P2_inv1 = pow(P2, MOD1 - 2, MOD1)
for i in range(max_coord):
pow1_1[i+1] = (pow1_1[i] * P1) % MOD1
pow2_1[i+1] = (pow2_1[i] * P2) % MOD1
inv1_1[i+1] = (inv1_1[i] * P1_inv1) % MOD1
inv2_1[i+1] = (inv2_1[i] * P2_inv1) % MOD1
# 数字と回転後の数字のハッシュ値 (乱数)
R_fwd = {0: 123, 1: 234, 2: 345, 5: 456, 6: 567, 8: 678, 9: 789}
f = {0: 0, 1: 1, 2: 2, 5: 5, 6: 9, 8: 8, 9: 6}
R_bwd = {k: R_fwd[v] for k, v in f.items()}
# --- Fenwickツリーの構築 ---
# 衝突を避けるためハッシュを2セット使う(今回は1セットで実装)
bit_fwd = FenwickTree2D(compressed_h, compressed_w)
bit_bwd = FenwickTree2D(compressed_h, compressed_w)
for r, c, x in points:
comp_r, comp_c = row_map[r], col_map[c]
h_fwd = (pow1_1[r] * pow2_1[c] * R_fwd[x]) % MOD1
h_bwd = (inv1_1[r] * inv2_1[c] * R_bwd[x]) % MOD1
bit_fwd.add(comp_r, comp_c, h_fwd)
bit_bwd.add(comp_r, comp_c, h_bwd)
# --- クエリ処理 ---
for l, d, r, u in queries:
# 圧縮後の座標範囲を求める
comp_l = row_map.get(l)
if comp_l is None: # もし範囲の端点が非ゼロ要素になければ二分探索で探す
idx =_bisect_left(all_rows, l)
comp_l = idx
comp_r = row_map.get(r)
if comp_r is None:
idx = _bisect_right(all_rows, r)
comp_r = idx - 1
comp_d = col_map.get(d)
if comp_d is None:
idx =_bisect_left(all_cols, d)
comp_d = idx
comp_u = col_map.get(u)
if comp_u is None:
idx = _bisect_right(all_cols, u)
comp_u = idx - 1
if comp_l > comp_r or comp_d > comp_u:
# 範囲内に非ゼロ要素が一つも無い
print("Yes")
continue
sum_fwd = bit_fwd.query(comp_l, comp_d, comp_r, comp_u) % MOD1
sum_bwd_base = bit_bwd.query(comp_l, comp_d, comp_r, comp_u) % MOD1
factor = (pow1_1[r + l] * pow2_1[u + d]) % MOD1
sum_bwd = (sum_bwd_base * factor) % MOD1
if sum_fwd == sum_bwd:
print("Yes")
else:
print("No")
from bisect import bisect_left as _bisect_left, bisect_right as _bisect_right
solve()