結果
| 問題 | 
                            No.3031 曲面の向き付け
                             | 
                    
| コンテスト | |
| ユーザー | 
                             titia
                         | 
                    
| 提出日時 | 2025-06-24 05:56:55 | 
| 言語 | PyPy3  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 1,183 ms / 2,000 ms | 
| コード長 | 1,939 bytes | 
| コンパイル時間 | 369 ms | 
| コンパイル使用メモリ | 82,596 KB | 
| 実行使用メモリ | 174,104 KB | 
| 最終ジャッジ日時 | 2025-06-24 05:57:08 | 
| 合計ジャッジ時間 | 12,580 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge3 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 4 | 
| other | AC * 29 | 
ソースコード
import sys
input = sys.stdin.readline
from collections import defaultdict
M=int(input())
X=[list(map(int,input().split())) for i in range(M)]
D=defaultdict(list)
for i in range(M):
    x,y,z=X[i]
    D[x,y].append(i)
    D[y,z].append(i)
    D[x,z].append(i)
for d in D:
    if len(D[d])>=3:
        print("NO")
        exit()
        
USE=[-1]*M
for i in range(M):
    if USE[i]!=-1:
        continue
    USE[i]=0
    Q=[i]
    while Q:
        ind=Q.pop()
        x,y,z=X[ind]
        if len(D[x,y])==2:
            if D[x,y][0]==ind:
                ind2=D[x,y][1]
            else:
                ind2=D[x,y][0]
            x2,y2,z2=X[ind2]
            if x2==x and z2==y:
                u2=USE[ind]
            else:
                u2=USE[ind]^1
            if USE[ind2]!=-1 and USE[ind2]!=u2:
                print("NO")
                exit()
            if USE[ind2]==-1:
                USE[ind2]=u2
                Q.append(ind2)
        if len(D[y,z])==2:
            if D[y,z][0]==ind:
                ind2=D[y,z][1]
            else:
                ind2=D[y,z][0]
            x2,y2,z2=X[ind2]
            if x2==y and z2==z:
                u2=USE[ind]
            else:
                u2=USE[ind]^1
            if USE[ind2]!=-1 and USE[ind2]!=u2:
                print("NO")
                exit()
            if USE[ind2]==-1:
                USE[ind2]=u2
                Q.append(ind2)
        if len(D[x,z])==2:
            if D[x,z][0]==ind:
                ind2=D[x,z][1]
            else:
                ind2=D[x,z][0]
            x2,y2,z2=X[ind2]
            if x2==x and z2==z:
                u2=USE[ind]^1
            else:
                u2=USE[ind]
            if USE[ind2]!=-1 and USE[ind2]!=u2:
                print("NO")
                exit()
            if USE[ind2]==-1:
                USE[ind2]=u2
                Q.append(ind2)
print("YES")
            
        
        
            
            
            
        
            
titia