結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
もぐら 3.0
|
| 提出日時 | 2023-11-22 19:06:58 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
MLE
|
| 実行時間 | - |
| コード長 | 2,702 bytes |
| コンパイル時間 | 160 ms |
| コンパイル使用メモリ | 82,176 KB |
| 実行使用メモリ | 852,568 KB |
| 最終ジャッジ日時 | 2024-09-26 07:37:13 |
| 合計ジャッジ時間 | 10,981 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 30 MLE * 1 -- * 6 |
ソースコード
import collections
class UnionFind():
def __init__(self):
self.parents = dict()
self.members_set = collections.defaultdict(lambda : set())
self.roots_set = set()
self.key_ID = dict()
self.ID_key = dict()
self.cnt = 0
def dictf(self,x):
if x in self.key_ID:
return self.key_ID[x]
else:
self.cnt += 1
self.key_ID[x] = self.cnt
self.parents[x] = self.cnt
self.ID_key[self.cnt] = x
self.members_set[x].add(x)
self.roots_set.add(x)
return self.key_ID[x]
def find(self, x):
ID_x = self.dictf(x)
if self.parents[x] == ID_x:
return x
else:
self.parents[x] = self.key_ID[self.find(self.ID_key[self.parents[x]])]
return self.ID_key[self.parents[x]]
def union(self, x, y):
x = self.find(x)
y = self.find(y)
if self.parents[x] > self.parents[y]:
x, y = y, x
if x == y:
return
for i in self.members_set[y]:
self.members_set[x].add(i)
self.members_set[y] = set()
self.roots_set.remove(y)
self.parents[y] = self.key_ID[x]
def size(self, x):
return len(self.members_set[self.find(x)])
def same(self, x, y):
return self.find(x) == self.find(y)
def members(self, x):
return self.members_set[self.find(x)]
def roots(self):
return self.roots_set
def group_count(self):
return len(self.roots_set)
def all_group_members(self):
return {r: self.members_set[r] for r in self.roots_set}
import bisect
N,A,B = map(int,input().split())
x = list(map(int,input().split()))
# 下準備、駅xからA〜Bの範囲内にある最初の駅と辺を張る。A~Bの範囲内にある駅同士を辺で繋ぐ(n-1本)。
# それらの辺情報をtupleでallに入れる。
all = []
for i in range(N):
left = bisect.bisect_left(x,x[i]+A)
right = bisect.bisect_right(x,x[i]+B)
if right-left==1:
all.append((i,left))
elif right-left>=2:
for j in range(left,right-1):
all.append((j,j+1))
all.append((i,j))
#allからつないだ辺情報を取り出して、辺で繋いだ駅をunionしていく
uf_s = UnionFind()
for e in all:
uf_s.union(e[0], e[1])
#順番にその駅番号が所属するmember数を出力する
for n in range(N):
print(len(uf_s.members(n)))
もぐら 3.0