結果
問題 | No.274 The Wall |
ユーザー |
![]() |
提出日時 | 2023-05-17 10:05:02 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 357 ms / 2,000 ms |
コード長 | 3,186 bytes |
コンパイル時間 | 306 ms |
コンパイル使用メモリ | 82,092 KB |
実行使用メモリ | 78,592 KB |
最終ジャッジ日時 | 2024-12-15 05:29:22 |
合計ジャッジ時間 | 4,940 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 22 |
ソースコード
import sysreadline=sys.stdin.readlinedef SCC(N,edges):start = [0] * (N + 1)elist = [0] * len(edges)for e in edges:start[e[0] + 1] += 1for 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]] += 1N = Nnow_ord = group_num = 0visited = []low = [0] * Norder = [-1] * Nids = [0] * Nparent = [-1] * Nstack = []for i in range(N):if order[i] == -1:stack.append(i)stack.append(i)while stack:v = stack.pop()if order[v] == -1:low[v] = order[v] = now_ordnow_ord += 1visited.append(v)for i in range(start[v], start[v + 1]):to = elist[i]if order[to] == -1:stack.append(to)stack.append(to)parent[to] = velse:low[v] = min(low[v], order[to])else:if low[v] == order[v]:while True:u = visited.pop()order[u] = Nids[u] = group_numif u == v:breakgroup_num += 1if parent[v] != -1:low[parent[v]] = min(low[parent[v]], low[v])for i, x in enumerate(ids):ids[i] = group_num - 1 - xgroups = [[] for _ in range(group_num)]for i, x in enumerate(ids):groups[x].append(i)return groupsclass TwoSAT:def __init__(self,N):self.N=Nself.edges=[]def Add_Clause(self,i,f,j,g):assert 0<=i<self.Nassert 0<=j<self.Nself.edges.append((2*i+(0 if f else 1),2*j+(1 if g else 0)))self.edges.append((2*j+(0 if g else 1),2*i+(1 if f else 0)))def Satisfiable(self):scc=SCC(2*self.N,self.edges)idx=[None]*2*self.Nfor i,lst in enumerate(scc):for x in lst:idx[x]=iretu=[None]*self.Nfor i in range(self.N):if idx[2*i]==idx[2*i+1]:return Noneretu[i]=idx[2*i]<idx[2*i+1]return retuN,M=map(int,readline().split())L,R=[],[]for n in range(N):l,r=map(int,readline().split())r+=1L.append(l)R.append(r)if sum(r-l for l,r in zip(L,R))>M:print("NO")exit()TSAT=TwoSAT(N)for i in range(N):for j in range(i+1,N):for bi in (0,1):if bi==0:li,ri=L[i],R[i]else:li,ri=M-R[i],M-L[i]for bj in (0,1):if bj==0:lj,rj=L[j],R[j]else:lj,rj=M-R[j],M-L[j]if max(li,lj)<min(ri,rj):TSAT.Add_Clause(i,bi,j,bj)if TSAT.Satisfiable():ans="YES"else:ans="NO"print(ans)