Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- */
- #pragma comment(linker, "/STACK:16777216")
- #include <fstream>
- #include <iostream>
- #include <string>
- #include <complex>
- #include <math.h>
- #include <set>
- #include <vector>
- #include <map>
- #include <queue>
- #include <stdio.h>
- #include <stack>
- #include <algorithm>
- #include <list>
- #include <ctime>
- #include <memory.h>
- #include <ctime>
- #define y0 sdkfaslhagaklsldk
- #define y1 aasdfasdfasdf
- #define yn askfhwqriuperikldjk
- #define j1 assdgsdgasghsf
- #define tm sdfjahlfasfh
- #define lr asgasgash
- #define eps 1e-6
- //#define M_PI 3.141592653589793
- #define bs 1000000007
- #define bsize 256
- #define right adsgasgadsg
- #define free adsgasdg
- using namespace std;
- long long n;
- double cost[1<<18];
- long long a,b;
- vector<long long> g[1<<18];
- long long used[1<<18];
- double ans[1<<18];
- long sz[1<<18];
- long long par[1<<18];
- double upans[1<<18];
- double tans[1<<18];
- void dfs(long v)
- {
- used[v]=1;
- vector<long> sons;
- for (int i=0;i<g[v].size();i++)
- {
- long q=g[v][i];
- if (used[q])continue;
- par[q]=v;
- dfs(q);
- sons.push_back(q);
- }
- sz[v]=sons.size();
- for (int i=0;i<sons.size();i++)
- {
- long q=sons[i];
- ans[v]+=(ans[q]+cost[q])*1.0/sz[v];
- }
- }
- void solve(long v)
- {
- used[v]=1;
- if (par[v])
- {
- long q=par[v];
- double pup=1./(sz[q]);
- upans[v]=upans[q]*pup;
- // cout<<v<<"^"<<upans[v]<<endl;
- if (sz[q]>1)upans[v]+=(ans[q]*sz[q]-ans[v]-cost[v])/(sz[q]);
- // cout<<v<<"^^"<<upans[v]<<endl;
- upans[v]+=cost[q];
- tans[v]=(ans[v]*sz[v]+upans[v])/(sz[v]+1)+cost[v];
- }
- else // root
- tans[v]=ans[v]+cost[v];
- for (int i=0;i<g[v].size();i++)
- {
- long q=g[v][i];
- if (used[q])continue;
- solve(q);
- }
- }
- int main(){
- //freopen("repair.in","r",stdin);
- //freopen("repair.out","w",stdout);
- //freopen("C:/input.txt","r",stdin);
- //freopen("C:/output.txt","w",stdout);
- ios_base::sync_with_stdio(0);
- //cin.tie(0);
- cin>>n;
- //if (n>1600)return 1;
- for (int i=1;i<=n;i++)
- {
- cin>>cost[i];
- //cost[i]=1000000;
- //if (i==n/2+1)cost[i]=1;
- }
- for (int i=1;i<n;i++)
- {
- cin>>a>>b;
- // a=i;
- // b=i+1;
- g[a].push_back(b);
- g[b].push_back(a);
- }
- int id=rand()%n+1;
- //cout<<id<<endl;
- dfs(id);
- /*
- for (int i=1;i<=n;i++)
- cout<<ans[i]<<" ";
- cout<<endl;
- */
- for (int i=1;i<=n;i++)
- used[i]=0;
- solve(id);
- /*
- for (int i=1;i<=n;i++)
- cout<<ans[i]<<" ";
- cout<<endl;*/
- /*
- for (int i=1;i<=n;i++)
- cout<<sz[i]<<"*";
- cout<<endl;
- *//*
- cout<<"^"<<endl;
- */
- /*
- for (int i=1;i<=n;i++)
- cout<<upans[i]<<" ( ";//endl;
- cout<<endl;
- for (int i=1;i<=n;i++)
- cout<<fixed<<tans[i]<<" ";
- cout<<endl;
- */
- // if (n==1)return 1;
- long er=0;
- long bp=1;
- for (int i=1;i<=n;i++)
- if(tans[i]<tans[bp]-eps)bp=i;
- for (int i=1;i<=n;i++)
- if (fabs(tans[i]-tans[bp])<0.4)er++;
- if (er>1)while (true);//return 1;
- cout<<bp<<endl;
- cin.get();cin.get();
- return 0;}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement