結果
| 問題 |
No.1170 Never Want to Walk
|
| コンテスト | |
| ユーザー |
もぐら 3.0
|
| 提出日時 | 2023-11-22 22:16:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,181 bytes |
| コンパイル時間 | 472 ms |
| コンパイル使用メモリ | 82,432 KB |
| 実行使用メモリ | 292,604 KB |
| 最終ジャッジ日時 | 2024-09-26 07:41:49 |
| 合計ジャッジ時間 | 18,114 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | WA * 2 |
| other | WA * 37 |
ソースコード
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の範囲内にある"最初の駅"と辺を張る。allにtupleで入れておく。
# 駅xからA~Bの距離間に2つ以上駅があったら(left,right)を記録。tempにtupleで入れておく。
all = []
temp = []
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:
all.append((i,left))
temp.append((left,right))
#tempにある辺について重複区間の処理をして辺の組み合わせの数を減らす
if temp:
# temp.sort(key=lambda x:x[0])
new = []
now = temp[0]
for i in range(1,len(temp)):
if now[1]<temp[i][0]:
new.append(now)
now = temp[i]
else:
now = (now[0],temp[i][1])
new.append(now)
for d in new:
for f in range(d[0],d[1]-1):
all.append((f,f+1))
print(all)
#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