結果
問題 | No.274 The Wall |
ユーザー |
![]() |
提出日時 | 2023-05-11 21:31:51 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,110 bytes |
コンパイル時間 | 1,421 ms |
コンパイル使用メモリ | 82,132 KB |
実行使用メモリ | 593,020 KB |
最終ジャッジ日時 | 2024-11-27 17:40:36 |
合計ジャッジ時間 | 12,015 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 21 TLE * 1 |
ソースコード
from collections import defaultdict, deque, Counterimport copyfrom itertools import combinations, permutations, product, accumulate, groupbyfrom heapq import heapify, heappop, heappushimport mathimport bisectfrom pprint import pprintimport sys# sys.setrecursionlimit(700000)input = lambda: sys.stdin.readline().rstrip('\n')inf = float('inf')mod1 = 10**9+7mod2 = 998244353def ceil_div(x, y): return -(-x//y)#################################################def sccd(adj):n = len(adj)been = [False]*nP = []for s in range(n):if been[s]: continuestack = [s]while stack:now = stack.pop()if now >= 0:if been[now]: continuebeen[now] = Truestack.append(~now)for nxt in adj[now]:if been[nxt]: continuestack.append(nxt)else:P.append(~now)radj = [[] for _ in range(n)]for i, neighbor in enumerate(adj):for j in neighbor:radj[j].append(i)scc_prev = []scc_idx = [None]*nfor s in reversed(P):if not been[s]: continuebeen[s] = Falsestack = [s]scc = []while stack:now = stack.pop()scc_idx[now] = len(scc_prev)scc.append(now)for nxt in radj[now]:if not been[nxt]: continuebeen[nxt] = Falsestack.append(nxt)scc_prev.append(scc)return scc_idxclass Two_SAT:def __init__(self, n) -> None:self.n = nself.adj = [[] 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.adj[self.n+y].append(x)elif x >= 0:y = ~yself.adj[self.n+x].append(self.n+y)self.adj[y].append(x)elif y >= 0:x = ~xself.adj[x].append(y)self.adj[self.n+y].append(self.n+x)else:x = ~x; y = ~yself.adj[x].append(self.n+y)self.adj[y].append(self.n+x)def solve(self):scc_idx = sccd(self.adj)ret = [False]*self.nfor x in range(self.n):i, j = scc_idx[x], scc_idx[self.n+x]if i == j:return Noneret[x] = i > jreturn retdef is_intersect(li, ri, lj, rj):if li > lj: li, ri, lj, rj = ri, rj, li, ljreturn lj <= riN, 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 blocksans = sat.solve()print("YNEOS"[ans is None::2])