結果
問題 | No.274 The Wall |
ユーザー | prin_kemkem |
提出日時 | 2023-05-11 21:26:53 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,128 bytes |
コンパイル時間 | 191 ms |
コンパイル使用メモリ | 82,180 KB |
実行使用メモリ | 592,772 KB |
最終ジャッジ日時 | 2024-05-05 17:50:45 |
合計ジャッジ時間 | 11,697 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 94 ms
79,824 KB |
testcase_01 | AC | 92 ms
80,128 KB |
testcase_02 | AC | 92 ms
79,616 KB |
testcase_03 | AC | 958 ms
361,892 KB |
testcase_04 | AC | 91 ms
79,768 KB |
testcase_05 | AC | 94 ms
80,352 KB |
testcase_06 | AC | 92 ms
80,000 KB |
testcase_07 | AC | 93 ms
80,064 KB |
testcase_08 | AC | 94 ms
80,024 KB |
testcase_09 | AC | 95 ms
80,072 KB |
testcase_10 | AC | 94 ms
80,244 KB |
testcase_11 | TLE | - |
testcase_12 | AC | 142 ms
81,480 KB |
testcase_13 | AC | 113 ms
80,768 KB |
testcase_14 | AC | 146 ms
82,232 KB |
testcase_15 | AC | 185 ms
82,164 KB |
testcase_16 | AC | 1,172 ms
315,292 KB |
testcase_17 | AC | 1,149 ms
316,748 KB |
testcase_18 | AC | 1,250 ms
316,632 KB |
testcase_19 | AC | 224 ms
83,212 KB |
testcase_20 | AC | 230 ms
83,592 KB |
testcase_21 | AC | 208 ms
83,300 KB |
testcase_22 | AC | 224 ms
82,844 KB |
testcase_23 | AC | 223 ms
83,204 KB |
testcase_24 | AC | 225 ms
83,332 KB |
testcase_25 | AC | 221 ms
83,196 KB |
ソースコード
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): 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) radj = [[] for _ in range(n)] for i, neighbor in enumerate(adj): for j in neighbor: radj[j].append(i) scc_prev = [] scc_idx = [None]*n for s in reversed(P): if not been[s]: continue been[s] = False stack = [s] scc = [] while stack: now = stack.pop() scc_idx[now] = (len(scc_prev), len(scc)) scc.append(now) for nxt in radj[now]: if not been[nxt]: continue been[nxt] = False stack.append(nxt) scc_prev.append(scc) return scc_idx class Two_SAT: def __init__(self, n) -> None: self.n = n self.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 = ~y self.adj[self.n+x].append(self.n+y) self.adj[y].append(x) elif y >= 0: x = ~x self.adj[x].append(y) self.adj[self.n+y].append(self.n+x) else: x = ~x; y = ~y self.adj[x].append(self.n+y) self.adj[y].append(self.n+x) def solve(self): scc_idx = sccd(self.adj) ret = [False]*self.n for x in range(self.n): i, j = scc_idx[x][0], scc_idx[self.n+x][0] if i == j: return None ret[x] = i > j return ret 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])