結果
問題 | No.274 The Wall |
ユーザー | prin_kemkem |
提出日時 | 2023-05-11 21:37:02 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 3,055 bytes |
コンパイル時間 | 244 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 592,744 KB |
最終ジャッジ日時 | 2024-05-05 17:57:16 |
合計ジャッジ時間 | 11,590 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 98 ms
79,488 KB |
testcase_01 | AC | 102 ms
80,000 KB |
testcase_02 | AC | 94 ms
79,744 KB |
testcase_03 | AC | 960 ms
361,780 KB |
testcase_04 | AC | 107 ms
79,616 KB |
testcase_05 | AC | 110 ms
79,872 KB |
testcase_06 | AC | 114 ms
79,744 KB |
testcase_07 | AC | 111 ms
79,616 KB |
testcase_08 | AC | 101 ms
79,488 KB |
testcase_09 | AC | 95 ms
79,744 KB |
testcase_10 | AC | 94 ms
80,000 KB |
testcase_11 | TLE | - |
testcase_12 | AC | 145 ms
81,536 KB |
testcase_13 | AC | 127 ms
80,000 KB |
testcase_14 | AC | 155 ms
82,048 KB |
testcase_15 | AC | 185 ms
82,308 KB |
testcase_16 | AC | 1,199 ms
315,808 KB |
testcase_17 | AC | 1,159 ms
316,108 KB |
testcase_18 | AC | 1,235 ms
316,720 KB |
testcase_19 | AC | 211 ms
83,344 KB |
testcase_20 | AC | 214 ms
83,352 KB |
testcase_21 | AC | 207 ms
82,644 KB |
testcase_22 | AC | 224 ms
83,096 KB |
testcase_23 | AC | 242 ms
83,460 KB |
testcase_24 | AC | 224 ms
82,820 KB |
testcase_25 | AC | 230 ms
83,212 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 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)] 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])