結果
| 問題 |
No.3200 Sinking Islands
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-07-11 22:03:00 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 858 ms / 2,000 ms |
| コード長 | 2,201 bytes |
| コンパイル時間 | 429 ms |
| コンパイル使用メモリ | 82,248 KB |
| 実行使用メモリ | 153,292 KB |
| 最終ジャッジ日時 | 2025-07-11 22:03:24 |
| 合計ジャッジ時間 | 14,484 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
class dsu():
n=1
parent_or_size=[-1 for i in range(n)]
def __init__(self,N):
self.n=N
self.parent_or_size=[-1 for i in range(N)]
def merge(self,a,b):
assert 0<=a<self.n, "0<=a<n,a={0},n={1}".format(a,self.n)
assert 0<=b<self.n, "0<=b<n,b={0},n={1}".format(b,self.n)
x=self.leader(a)
y=self.leader(b)
if x==y:
return x
if (-self.parent_or_size[x]<-self.parent_or_size[y]):
x,y=y,x
self.parent_or_size[x]+=self.parent_or_size[y]
self.parent_or_size[y]=x
return x
def same(self,a,b):
assert 0<=a<self.n, "0<=a<n,a={0},n={1}".format(a,self.n)
assert 0<=b<self.n, "0<=b<n,b={0},n={1}".format(b,self.n)
return self.leader(a)==self.leader(b)
def leader(self,a):
assert 0<=a<self.n, "0<=a<n,a={0},n={1}".format(a,self.n)
if (self.parent_or_size[a]<0):
return a
self.parent_or_size[a]=self.leader(self.parent_or_size[a])
return self.parent_or_size[a]
def size(self,a):
assert 0<=a<self.n, "0<=a<n,a={0},n={1}".format(a,self.n)
return -self.parent_or_size[self.leader(a)]
def groups(self):
leader_buf=[0 for i in range(self.n)]
group_size=[0 for i in range(self.n)]
for i in range(self.n):
leader_buf[i]=self.leader(i)
group_size[leader_buf[i]]+=1
result=[[] for i in range(self.n)]
for i in range(self.n):
result[leader_buf[i]].append(i)
result2=[]
for i in range(self.n):
if len(result[i])>0:
result2.append(result[i])
return result2
n,m=map(int,input().split())
edge=[list(map(int,input().split())) for _ in range(m)]
q=int(input())
Q=[int(input())-1 for _ in range(q)]
QS=set(Q)
G=dsu(n)
for i in range(m):
if i not in QS:
a,b=edge[i]
a-=1
b-=1
G.merge(a,b)
UF=G.groups()
tmp=0
for e in UF:
tmp+=(n-len(e))*len(e)
cnt=tmp//2
ans=[]
for i in Q[::-1]:
ans.append(cnt)
a,b=edge[i]
a-=1
b-=1
if G.same(a,b):
pass
else:
A=G.size(a)
B=G.size(b)
cnt-=A*B
G.merge(a,b)
for e in ans[::-1]:
print(e)