結果
問題 | No.274 The Wall |
ユーザー |
![]() |
提出日時 | 2023-05-11 21:47:06 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,247 bytes |
コンパイル時間 | 333 ms |
コンパイル使用メモリ | 82,048 KB |
実行使用メモリ | 795,228 KB |
最終ジャッジ日時 | 2024-11-27 17:51:16 |
合計ジャッジ時間 | 12,345 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 TLE * 1 |
ソースコード
from collections import defaultdict, deque, Counter import copy from itertools import combinations, permutations, product, accumulate, groupby from heapq import heapify, heappop, heappush import math import bisect from pprint import pprint import sys # sys.setrecursionlimit(700000) input = lambda: sys.stdin.readline().rstrip('\n') inf = float('inf') mod1 = 10**9+7 mod2 = 998244353 def ceil_div(x, y): return -(-x//y) ################################################# def sccd(adj, radj): n = len(adj) been = [False]*n P = [] for s in range(n): if been[s]: continue stack = [s] while stack: now = stack.pop() if now >= 0: if been[now]: continue been[now] = True stack.append(~now) for nxt in adj[now]: if been[nxt]: continue stack.append(nxt) else: P.append(~now) scc_idx = [None]*n idx = 0 for s in reversed(P): if not been[s]: continue been[s] = False stack = [s] while stack: now = stack.pop() scc_idx[now] = idx for nxt in radj[now]: if not been[nxt]: continue been[nxt] = False stack.append(nxt) idx += 1 return scc_idx class Two_SAT: def __init__(self, n) -> None: self.n = n self.adj = [[] for _ in range(2*n)] self.radj = [[] for _ in range(2*n)] def add(self, x, y): # 否定したいときは~xを入れる if x >= 0 and y >= 0: self.adj[self.n+x].append(y) self.radj[y].append(self.n+x) self.adj[self.n+y].append(x) self.radj[x].append(self.n+y) elif x >= 0: y = ~y self.adj[self.n+x].append(self.n+y) self.radj[self.n+y].append(self.n+x) self.adj[y].append(x) self.radj[x].append(y) elif y >= 0: x = ~x self.adj[x].append(y) self.radj[y].append(x) self.adj[self.n+y].append(self.n+x) self.radj[self.n+x].append(self.n+y) else: x = ~x; y = ~y self.adj[x].append(self.n+y) self.radj[self.n+y].append(x) self.adj[y].append(self.n+x) self.radj[self.n+x].append(y) def solve(self): scc_idx = sccd(self.adj, self.radj) for x in range(self.n): i, j = scc_idx[x], scc_idx[self.n+x] if i == j: return None return 0 def is_intersect(li, ri, lj, rj): if li > lj: li, ri, lj, rj = ri, rj, li, lj return lj <= ri N, M = map(int, input().split()) blocks = [tuple(map(int, input().split())) for _ in range(N)] sat = Two_SAT(N) for i in range(N): li, ri = blocks[i] for j in range(i+1, N): lj, rj = blocks[j] if is_intersect(li, ri, lj, rj): sat.add(~i, ~j) if is_intersect(li, ri, M-1-rj, M-1-lj): sat.add(~i, j) if is_intersect(M-1-ri, M-1-li, lj, rj): sat.add(i, ~j) if is_intersect(M-1-ri, M-1-li, M-1-rj, M-1-lj): sat.add(i, j) del blocks ans = sat.solve() print("YNEOS"[ans is None::2])