結果
問題 | No.274 The Wall |
ユーザー | prin_kemkem |
提出日時 | 2023-05-11 21:31:51 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,110 bytes |
コンパイル時間 | 545 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 592,968 KB |
最終ジャッジ日時 | 2024-05-05 17:54:09 |
合計ジャッジ時間 | 11,819 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 95 ms
80,128 KB |
testcase_01 | AC | 96 ms
80,000 KB |
testcase_02 | AC | 97 ms
80,128 KB |
testcase_03 | AC | 959 ms
361,972 KB |
testcase_04 | AC | 96 ms
80,000 KB |
testcase_05 | AC | 93 ms
80,128 KB |
testcase_06 | AC | 94 ms
79,616 KB |
testcase_07 | AC | 94 ms
79,488 KB |
testcase_08 | AC | 94 ms
79,616 KB |
testcase_09 | AC | 97 ms
80,128 KB |
testcase_10 | AC | 110 ms
79,488 KB |
testcase_11 | TLE | - |
testcase_12 | AC | 150 ms
82,048 KB |
testcase_13 | AC | 118 ms
80,512 KB |
testcase_14 | AC | 149 ms
81,792 KB |
testcase_15 | AC | 181 ms
82,040 KB |
testcase_16 | AC | 1,161 ms
316,072 KB |
testcase_17 | AC | 1,134 ms
316,316 KB |
testcase_18 | AC | 1,246 ms
316,576 KB |
testcase_19 | AC | 211 ms
83,340 KB |
testcase_20 | AC | 221 ms
83,344 KB |
testcase_21 | AC | 218 ms
82,904 KB |
testcase_22 | AC | 223 ms
83,232 KB |
testcase_23 | AC | 220 ms
83,716 KB |
testcase_24 | AC | 218 ms
82,820 KB |
testcase_25 | AC | 221 ms
83,392 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) 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], 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])