結果
| 問題 |
No.828 全方位神童数
|
| コンテスト | |
| ユーザー |
ahe100
|
| 提出日時 | 2019-05-11 21:15:33 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 362 ms / 2,000 ms |
| コード長 | 1,445 bytes |
| コンパイル時間 | 1,761 ms |
| コンパイル使用メモリ | 176,828 KB |
| 実行使用メモリ | 30,208 KB |
| 最終ジャッジ日時 | 2024-07-02 01:26:53 |
| 合計ジャッジ時間 | 10,379 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 43 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i = 0;i<((int)(n));i++)
#define reg(i,a,b) for(int i = ((int)(a));i<=((int)(b));i++)
#define irep(i,n) for(int i = ((int)(n)-1);i>=0;i--)
#define ireg(i,a,b) for(int i = ((int)(b));i>=((int)(a));i--)
typedef long long ll;
/*
*/
ll n,r[200010],ans=1,mod=1e9+7;
vector<ll> v[200010],v2[200010],d(200010);
struct UnionFind{
int n;
vector<int> p;
UnionFind(){}
UnionFind(int sz):n(sz),p(sz,0){iota(p.begin(),p.end(),0);}
int find(int x){
return (x==p[x]?x:p[x]=find(p[x]));
}
bool same(int x,int y){
return find(x)==find(y);
}
void unite(int x,int y){
x=find(x);y=find(y);
if(x==y) return;
if(x<y) swap(x,y);
p[y]=x;
}
};
int dijkstra1(int s,vector<ll>& d,vector<ll> v[],ll INF=1e18){
int farthest=s;
queue<int> Q;
rep(i,d.size())d[i]=INF;
Q.push(s);
d[s]=0;
while(!Q.empty()){
int p = Q.front();Q.pop();
if(d[farthest]<d[p])farthest=p;
for(int q:v[p]){
if(d[q]>d[p]+1){
d[q]=d[p]+1;
Q.push(q);
}
}
}
return farthest;
}
void init(){
cin>>n;
rep(i,n)cin>>r[i];
rep(i,n-1){
ll a,b;
cin>>a>>b;
v[a-1].push_back(b-1);
v[b-1].push_back(a-1);
}
}
int main(void){
init();
UnionFind f(n);
rep(i,n){
for(ll p:v[i]){
if(p<i){
v2[f.find(p)].push_back(i);
v2[i].push_back(f.find(p));
f.unite(p,i);
}
}
}
dijkstra1(n-1,d,v2);
rep(i,n)ans=(ans*(d[i]+1+r[i]))%mod;
cout<<ans<<endl;
return 0;
}
ahe100