結果
問題 | No.274 The Wall |
ユーザー | prin_kemkem |
提出日時 | 2023-05-11 21:44:05 |
言語 | PyPy3 (7.3.15) |
結果 |
MLE
|
実行時間 | - |
コード長 | 3,305 bytes |
コンパイル時間 | 285 ms |
コンパイル使用メモリ | 87,192 KB |
実行使用メモリ | 809,392 KB |
最終ジャッジ日時 | 2023-08-18 12:43:17 |
合計ジャッジ時間 | 7,841 ms |
ジャッジサーバーID (参考情報) |
judge15 / judge14 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 138 ms
78,332 KB |
testcase_01 | AC | 133 ms
78,568 KB |
testcase_02 | AC | 142 ms
78,328 KB |
testcase_03 | AC | 956 ms
393,820 KB |
testcase_04 | AC | 166 ms
78,576 KB |
testcase_05 | AC | 138 ms
78,532 KB |
testcase_06 | AC | 134 ms
78,732 KB |
testcase_07 | AC | 136 ms
78,616 KB |
testcase_08 | AC | 136 ms
78,532 KB |
testcase_09 | AC | 136 ms
78,640 KB |
testcase_10 | AC | 129 ms
78,620 KB |
testcase_11 | MLE | - |
testcase_12 | AC | 898 ms
82,332 KB |
testcase_13 | AC | 201 ms
81,024 KB |
testcase_14 | AC | 215 ms
82,372 KB |
testcase_15 | AC | 210 ms
82,360 KB |
testcase_16 | AC | 1,186 ms
415,272 KB |
testcase_17 | AC | 1,157 ms
370,328 KB |
testcase_18 | AC | 1,204 ms
415,220 KB |
testcase_19 | AC | 237 ms
83,936 KB |
testcase_20 | AC | 245 ms
83,844 KB |
testcase_21 | AC | 246 ms
83,136 KB |
testcase_22 | AC | 258 ms
83,316 KB |
testcase_23 | AC | 252 ms
83,456 KB |
testcase_24 | AC | 259 ms
83,280 KB |
testcase_25 | AC | 256 ms
84,092 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, 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) ret = [False]*self.n for x in range(self.n): i, j = scc_idx[x], scc_idx[self.n+x] 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])