結果
| 問題 |
No.2654 [Cherry 6th Tune] Re: start! (Black Sheep)
|
| コンテスト | |
| ユーザー |
ゼット
|
| 提出日時 | 2024-02-23 23:49:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,337 bytes |
| コンパイル時間 | 369 ms |
| コンパイル使用メモリ | 82,356 KB |
| 実行使用メモリ | 444,300 KB |
| 最終ジャッジ日時 | 2024-09-29 09:20:16 |
| 合計ジャッジ時間 | 67,501 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 7 WA * 33 |
ソースコード
class segtreemin:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[10**10]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]=a
while x>1:
x//=2
self.dat[x]=min(self.dat[2*x],self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=10**10
while u<v:
if u&1:
score=min(score,self.dat[u])
u+=1
if v&1:
v-=1
score=min(score,self.dat[v])
u//=2
v//=2
return score
class segtreemax:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[0]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]=a
while x>1:
x//=2
self.dat[x]=max(self.dat[2*x],self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=0
while u<v:
if u&1:
score=max(score,self.dat[u])
u+=1
if v&1:
v-=1
score=max(score,self.dat[v])
u//=2
v//=2
return score
class segtree:
def __init__(self,n):
self.size=1
while self.size<n:
self.size*=2
self.dat=[0]*(self.size*2)
def update(self,x,a):
x+=self.size
self.dat[x]+=a
while x>1:
x//=2
self.dat[x]=(self.dat[2*x]+self.dat[2*x+1])
def querry(self,u,v):
u+=self.size
v+=self.size
score=0
while u<v:
if u&1:
score+=self.dat[u]
u+=1
if v&1:
v-=1
score+=self.dat[v]
u//=2
v//=2
return score
N=int(input())
Zmax=segtreemax(N+1)
Zmin=segtreemin(N+1)
Zsum=segtree(N+1)
Zcount=segtree(N+1)
import sys
sys.setrecursionlimit(10**8)
import pypyjit
pypyjit.set_param('max_unroll_recursion=-1')
A=list(map(int,input().split()))
result=[10**10]*(N+1)
G=[[] for i in range(N+1)]
for i in range(N):
a,b=map(int,input().split())
G[a].append(b)
G[b].append(a)
T={}
R={}
B=A[:]
B=set(B)
B=list(B)
B.sort()
for i in range(len(B)):
R[B[i]]=i
used=[False]*(N+1)
dist=[-1]*(N+1)
dist[0]=0
def dfs(x):
used[x]=True
Zmax.update(R[A[x]],A[x])
Zmin.update(R[A[x]],A[x])
Zcount.update(R[A[x]],1)
Zsum.update(R[A[x]],A[x])
if not A[x] in T:
T[A[x]]=1
else:
T[A[x]]+=1
if dist[x]<=1:
result[x]=-1
else:
k1=Zmax.querry(0,N+1)
k2=Zmin.querry(0,N+1)
if k1==k2:
result[x]=1
else:
count=Zcount.querry(0,N+1)
b=(count+1)//2
l=0
r=N
while True:
m=(l+r)//2
c=Zcount.querry(0,m+1)
if c>=b:
r=m
else:
l=m+1
if l==r:
break
c1=Zcount.querry(0,l)
d1=Zsum.querry(0,l)
c2=Zcount.querry(l+1,N+1)
d2=Zsum.querry(l+1,N+1)
result1=(c1*B[l]-d1)+((d2-k1)-(c2-1)*B[l])
result2=((c1-1)*B[l]-(d1-k2))+(d2-c2*B[l])
if B[l]!=k2:
result[x]=min(result[x],result2)
else:
result[x]=min(result[x],result2+1)
if B[l]!=k1:
result[x]=min(result[x],result1)
else:
result[x]=min(result[x],result1+1)
for y in G[x]:
if used[y]==True:
continue
dist[y]=dist[x]+1
dfs(y)
Zcount.update(R[A[x]],-1)
Zsum.update(R[A[x]],-A[x])
T[A[x]]-=1
if T[A[x]]==0:
Zmax.update(R[A[x]],0)
Zmin.update(R[A[x]],10**10)
dfs(0)
for i in range(1,N+1):
print(result[i])
ゼット