Advertisement
TheAnshul

Divisors quality

Jun 26th, 2018
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /***************************************************************************
  2.  * #######                    #                                            *
  3.  *    #     #    #  ######   # #    #    #   ####   #    #  #    #  #      *
  4.  *    #     #    #  #       #   #   ##   #  #       #    #  #    #  #      *
  5.  *    #     ######  #####  #     #  # #  #   ####   ######  #    #  #      *
  6.  *    #     #    #  #      #######  #  # #       #  #    #  #    #  #      *
  7.  *    #     #    #  #      #     #  #   ##  #    #  #    #  #    #  #      *
  8.  *    #     #    #  ###### #     #  #    #   ####   #    #   ####   ###### *
  9.  ***************************************************************************/
  10. #include<bits/stdc++.h>
  11. #define ll          long long
  12. #define pb          push_back
  13. #define endl        '\n'
  14. #define pii         pair<ll int,ll int>
  15. #define vi          vector<ll int>
  16. #define all(a)      (a).begin(),(a).end()
  17. #define F           first
  18. #define S           second
  19. #define sz(x)       (ll int)x.size()
  20. #define hell        1000000007
  21. #define rep(i,a,b)  for(ll int i=a;i<b;i++)
  22. #define lbnd        lower_bound
  23. #define ubnd        upper_bound
  24. #define bs          binary_search
  25. using namespace std;
  26.  
  27. #define N  100005
  28. ll a[N];
  29. vi  ad[N];
  30. bool vis[N]={0};
  31. vi timer;
  32. ll tin[N];
  33. ll tout[N];
  34. vi tree[4*N];
  35. ll div1[N];
  36. void dfs(ll node)
  37. {
  38.     timer.pb(node);
  39.     tin[node]=timer.size()-1;
  40.     vis[node]=1;
  41.     for(auto i:ad[node])
  42.     if(!vis[i])
  43.     dfs(i);
  44.     tout[node]=timer.size();
  45. }
  46. void build(ll node,ll start,ll end)
  47. {
  48.     if(start==end)
  49.     {
  50.         tree[node].pb(a[timer[start]]);
  51.         return;
  52.     }
  53.     ll mid=(start+end)/2;
  54.     build(2*node,start,mid);
  55.     build(2*node+1,mid+1,end);
  56.     merge(tree[2*node].begin(), tree[2*node].end(),tree[2*node+1].begin(), tree[2*node+1].end(),back_inserter(tree[node]));
  57.     return;
  58. }
  59. ll query(ll node,ll start,ll end,ll l,ll r,ll val)
  60. {
  61.     if(r<start || l>end || start>end || l>r)
  62.         return 0;
  63.     if(start>=l && end<=r)
  64.     {
  65.         ll p=lower_bound(tree[node].begin(), tree[node].end(),val)-tree[node].begin();
  66.         return p;
  67.     }
  68.     ll mid=(start+end)/2;
  69.     return(query(2*node,start,mid,l,r,val)+query(2*node+1,mid+1,end,l,r,val));
  70. }
  71. int main()
  72. {
  73.     ios_base::sync_with_stdio(false);
  74.     cin.tie(0);
  75.     cout.tie(0);
  76.     int TESTS=1;
  77. //  cin>>TESTS;
  78.     while(TESTS--)
  79.     {
  80.         ll n,x,y;
  81.         cin>>n;
  82.         rep(i,1,N)
  83.         {
  84.             for(ll j=i;j<N;j+=i)
  85.                 div1[j]++;
  86.         }
  87.         timer.pb(0);
  88.         rep(i,1,n+1)
  89.         cin>>a[i];
  90.         rep(i,0,n-1)
  91.         {
  92.             cin>>x>>y;
  93.             ad[x].pb(y);
  94.             ad[y].pb(x);
  95.         }
  96.         dfs(1);
  97.         build(1,1,n);
  98.         ll max=0,val;
  99.         rep(i,1,n+1)
  100.         {
  101.             ll sum=query(1,1,n,tin[i]+1,tout[i]-1,a[i]);
  102.             if(sum!=0)
  103.             {
  104.                 val=div1[sum];
  105.                 if(val>max)
  106.                     max=val;
  107.             }
  108.         }
  109.         cout<<max;
  110.     }
  111.     return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement