結果
問題 | No.1502 Many Simple Additions |
ユーザー | とりゐ |
提出日時 | 2021-04-17 14:59:31 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 3,276 bytes |
コンパイル時間 | 239 ms |
コンパイル使用メモリ | 82,448 KB |
実行使用メモリ | 138,044 KB |
最終ジャッジ日時 | 2024-09-14 23:54:02 |
合計ジャッジ時間 | 10,015 ms |
ジャッジサーバーID (参考情報) |
judge6 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 44 ms
56,088 KB |
testcase_01 | AC | 43 ms
54,732 KB |
testcase_02 | AC | 43 ms
54,768 KB |
testcase_03 | AC | 44 ms
55,188 KB |
testcase_04 | AC | 43 ms
55,672 KB |
testcase_05 | WA | - |
testcase_06 | AC | 43 ms
54,740 KB |
testcase_07 | AC | 44 ms
55,368 KB |
testcase_08 | AC | 43 ms
55,488 KB |
testcase_09 | AC | 44 ms
54,856 KB |
testcase_10 | AC | 44 ms
54,988 KB |
testcase_11 | AC | 43 ms
54,740 KB |
testcase_12 | AC | 44 ms
56,188 KB |
testcase_13 | AC | 43 ms
55,432 KB |
testcase_14 | AC | 44 ms
56,264 KB |
testcase_15 | AC | 43 ms
55,036 KB |
testcase_16 | AC | 44 ms
55,784 KB |
testcase_17 | WA | - |
testcase_18 | RE | - |
testcase_19 | WA | - |
testcase_20 | WA | - |
testcase_21 | WA | - |
testcase_22 | RE | - |
testcase_23 | RE | - |
testcase_24 | AC | 44 ms
56,408 KB |
testcase_25 | AC | 43 ms
55,180 KB |
testcase_26 | AC | 46 ms
55,584 KB |
testcase_27 | AC | 262 ms
106,744 KB |
testcase_28 | AC | 264 ms
106,624 KB |
testcase_29 | AC | 149 ms
104,460 KB |
testcase_30 | RE | - |
testcase_31 | RE | - |
testcase_32 | RE | - |
testcase_33 | WA | - |
testcase_34 | WA | - |
testcase_35 | WA | - |
testcase_36 | AC | 182 ms
94,548 KB |
testcase_37 | AC | 181 ms
94,468 KB |
testcase_38 | AC | 295 ms
96,432 KB |
testcase_39 | AC | 158 ms
85,400 KB |
testcase_40 | AC | 326 ms
91,352 KB |
testcase_41 | AC | 173 ms
85,332 KB |
testcase_42 | AC | 542 ms
125,452 KB |
testcase_43 | AC | 44 ms
55,908 KB |
ソースコード
from collections import defaultdict from collections import deque class UnionFind(): def __init__(self, n): self.n = n self.parents = [-1] * n def find(self, x): if self.parents[x] < 0: return x else: self.parents[x] = self.find(self.parents[x]) return self.parents[x] def union(self, x, y): x = self.find(x) y = self.find(y) if x == y: return if self.parents[x] > self.parents[y]: x, y = y, x self.parents[x] += self.parents[y] self.parents[y] = x def size(self, x): return -self.parents[self.find(x)] def same(self, x, y): return self.find(x) == self.find(y) def members(self, x): root = self.find(x) return [i for i in range(self.n) if self.find(i) == root] def roots(self): return [i for i, x in enumerate(self.parents) if x < 0] def group_count(self): return len(self.roots()) def all_group_members(self): group_members = defaultdict(list) for member in range(self.n): group_members[self.find(member)].append(member) return group_members mod=10**9+7 INF=10**100 n,m,k=map(int,input().split()) edge=[[] for i in range(n)] uf=UnionFind(n) for i in range(m): a,b,c=map(int,input().split()) edge[a-1].append([b-1,c]) edge[b-1].append([a-1,c]) uf.union(a-1,b-1) def f(G): d={} for i in range(len(G)): d[G[i]]=i q=deque() q.append([0,0]) seen=[[INF,INF] for i in range(len(G))] seen[0][0]=0 while q: x=q.pop() for v in edge[G[x[0]]]: V=d[v[0]] W=v[1] if seen[V][(x[1]+1)%2]==INF: if x[1]==0: seen[V][1]=W-seen[x[0]][0] else: seen[V][0]=W-seen[x[0]][1] if seen[V][0]!=INF and seen[V][1]!=INF: if (seen[V][0]+seen[V][1])%2==1: return 0,0 else: return bfs((seen[V][1]-seen[V][0])//2,G) else: q.append([V,(x[1]+1)%2]) else: if x[1]==0: if seen[x[0]][0]+seen[V][1]!=W: return 0,0 else: if seen[x[0]][1]+seen[V][0]!=W: return 0,0 min0=INF+1 min1=INF+1 max0=-INF+1 max1=-INF+1 for i in range(len(G)): if seen[i][0]!=INF: min0=min(min0,seen[i][0]) max0=max(max0,seen[i][0]) if seen[i][1]!=INF: min1=min(min1,seen[i][1]) max1=max(max1,seen[i][1]) return max(min(k-max0,min1-1)-max(1-min0,max1-k,0)+1,0),max(min((k-1)-max0,min1-1)-max(1-min0,max1-(k-1),0)+1,0) def bfs(a,g): seen2=[INF]*len(g) seen2[0]=a d2={} for i in range(len(g)): d2[g[i]]=i q2=deque() q2.append(0) flag=True while q2: y=q2.pop() for vertex2 in edge[y]: V2=d2[vertex2[0]] W2=vertex2[1] if seen2[V2]==INF: seen2[V2]=W2-seen2[y] q2.append(V2) else: if seen2[V2]!=W2-seen2[y]: flag=False num1=0 num2=0 if flag and min(seen2)>0 and max(seen2)<=k: num1=1 if flag and min(seen2)>0 and max(seen2)<=k-1: num2=1 return num1,num2 cnt1=1 cnt2=1 for i in list(uf.all_group_members().values()): a,b=f(i) cnt1*=a cnt2*=b cnt1=cnt1%mod cnt2=cnt2%mod print((cnt1-cnt2)%mod)