結果
| 問題 |
No.274 The Wall
|
| コンテスト | |
| ユーザー |
brthyyjp
|
| 提出日時 | 2023-06-05 22:48:25 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 3,098 bytes |
| コンパイル時間 | 358 ms |
| コンパイル使用メモリ | 82,296 KB |
| 実行使用メモリ | 928,520 KB |
| 最終ジャッジ日時 | 2024-12-29 06:29:28 |
| 合計ジャッジ時間 | 15,429 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 4 |
| other | AC * 16 TLE * 2 MLE * 4 |
ソースコード
# https://github.com/shakayami/ACL-for-python/blob/master/two_sat.py
def two_sat(n,clause):
answer=[0]*n
edges=[]
N=2*n
for s in clause:
i,f,j,g=s
edges.append((2*i+(0 if f else 1),2*j+(1 if g else 0)))
edges.append((2*j+(0 if g else 1),2*i+(1 if f else 0)))
M=len(edges)
start=[0]*(N+1)
elist=[0]*M
for e in edges:
start[e[0]+1]+=1
for i in range(1,N+1):
start[i]+=start[i-1]
counter=start[:]
for e in edges:
elist[counter[e[0]]]=e[1]
counter[e[0]]+=1
visited=[]
low=[0]*N
Ord=[-1]*N
ids=[0]*N
NG=[0,0]
def dfs(v):
stack=[(v,-1,0),(v,-1,1)]
while stack:
v,bef,t=stack.pop()
if t:
if bef!=-1 and Ord[v]!=-1:
low[bef]=min(low[bef],Ord[v])
stack.pop()
continue
low[v]=NG[0]
Ord[v]=NG[0]
NG[0]+=1
visited.append(v)
for i in range(start[v],start[v+1]):
to=elist[i]
if Ord[to]==-1:
stack.append((to,v,0))
stack.append((to,v,1))
else:
low[v]=min(low[v],Ord[to])
else:
if low[v]==Ord[v]:
while(True):
u=visited.pop()
Ord[u]=N
ids[u]=NG[1]
if u==v:
break
NG[1]+=1
low[bef]=min(low[bef],low[v])
for i in range(N):
if Ord[i]==-1:
dfs(i)
for i in range(N):
ids[i]=NG[1]-1-ids[i]
for i in range(n):
if ids[2*i]==ids[2*i+1]:
return None
answer[i]=(ids[2*i]<ids[2*i+1])
return answer
import sys
import io, os
sys.setrecursionlimit(10**9)
input = io.BytesIO(os.read(0,os.fstat(0).st_size)).readline
n, m = map(int, input().split())
LR0 = []
LR1 = []
for i in range(n):
l, r = map(int, input().split())
LR0.append((l, r))
LR1.append((m-1-r, m-1-l))
clause = []
for i in range(n-1):
for j in range(i+1, n):
li0, ri0 = LR0[i]
li1, ri1 = LR1[i]
lj0, rj0 = LR0[j]
lj1, rj1 = LR1[j]
# 区間がかぶる場合を考える
if min(ri0, rj0) >= max(li0, lj0):
# ¬xi ∨ ¬xj
# xi ⇒ ¬xj, xj ⇒ ¬xi
clause.append((i, False, j, False))
if min(ri0, rj1) >= max(li0, lj1):
# ¬xi ∨ xj
# xi ⇒ xj, ¬xj ⇒ ¬xi
clause.append((i, False, j, True))
if min(ri1, rj0) >= max(li1, lj0):
# xi ∨ ¬xj
# ¬xi ⇒ ¬xj, xj ⇒ xi
clause.append((i, True, j, False))
if min(ri1, rj1) >= max(li1, lj1):
# xi ∨ xj
# ¬xi ⇒ xj, ¬xj ⇒ xi
clause.append((i, True, j, True))
ans = two_sat(n, clause)
if ans is not None:
print('YES')
else:
print('NO')
brthyyjp