Official

G - Diagonal Separation Editorial by toam


条件を言い換えましょう.マス \((x,y)\) が黒のとき,一つ目の条件からマス \((x,1),(x,2),\ldots,(x,y)\) はすべて黒色である必要があります.さらに マス \((x,j)\) が黒色のとき,二つ目の条件からマス \((1,j),(2,j),\ldots,(x,j)\) はすべて黒色である必要があります.よって, マス \((x,y)\) が黒のとき,マス \((x,y)\) より左上にあるマス(マス \((i,j)\ (1\leq i\leq x,1\leq j\leq y)\))はすべて黒色である必要があります.

これを踏まえたうえで,条件を満たすことができる必要十分条件は次のようになります.

  • \(C_i=\texttt{W}, C_j=\texttt{B},X_i\leq X_j,Y_i\leq Y_j\) となる \((i,j)\) が存在しない.

必要条件は上の議論から明らかです.十分条件は以下のように構成することができます.

  • マス \((x,y)\) について,\(x\leq X_i\) かつ \(y\leq Y_i\) かつ \(C_i=\texttt{B}\) を満たす \(i\) が存在するとき黒に, そうでないとき白で塗る

判定方法について考えます.愚直に調べると \(O(M^2)\) かかってしまい間に合いません.すでに塗られているマスを \((X_i,Y_i)\) の辞書順にソートします.そうすると,\(X_i\leq X_j\ (i\lt j)\) (かつ \(X_i=X_j\) のとき \(Y_i\lt Y_j\))が成り立つため,条件は

  • \(C_i=\texttt{W}, C_j=\texttt{B},Y_i\leq Y_j\) となる \((i,j)\ (i\lt j)\) が存在しない.

のように言い換えることができます.これは,\(i\) の昇順に見ていきながら \(C_i=\texttt{W}\) であるような \(i\)\(Y_i\) の最小値を管理することで判定することができます.

N, M = map(int, input().split())
xyc = []
for i in range(M):
    x, y, c = input().split()
    xyc.append((int(x), int(y), c))
xyc.sort()
min_y = 1 << 30
ans = "Yes"
for x, y, c in xyc:
    if c == "W":
        min_y = min(min_y, y)
    else:
        if y >= min_y:
            ans = "No"
print(ans)

posted:
last update: