Skip to content

Commit 4910b75

Browse files
authored
Merge pull request rachitiitr#7 from rachitkewl/master
Added Small To Large in Tree
2 parents 3197267 + 0e6f75d commit 4910b75

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

Tree/SmallToLarge.cpp

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
#define gc getchar_unlocked
4+
#define fo(i,n) for(i=0;i<n;i++)
5+
#define Fo(i,k,n) for(i=k;i<n;i++)
6+
#define ll long long
7+
#define si(x) scanf("%d",&x)
8+
#define sl(x) scanf("%I64d",&x)
9+
#define ss(s) scanf("%s",s)
10+
#define pb push_back
11+
#define mp make_pair
12+
#define F first
13+
#define S second
14+
#define all(x) x.begin(), x.end()
15+
#define clr(x) memset(x, 0, sizeof(x))
16+
#define sortall(x) sort(all(x))
17+
#define tr(it, a) for(auto it = a.begin(); it != a.end(); it++)
18+
#define PI 3.1415926535897932384626
19+
typedef pair<int, int> pii;
20+
typedef pair<ll, ll> pll;
21+
typedef vector<int> vi;
22+
typedef vector<ll> vl;
23+
typedef vector<pii> vpii;
24+
typedef vector<pll> vpll;
25+
typedef vector<vi> vvi;
26+
typedef vector<vl> vvl;
27+
const int mod = 1000000007;
28+
const int N = 3e5;
29+
vi g[N];
30+
int a[N];
31+
32+
//BEGIN
33+
map<int, ll> cnt[N], val[N];
34+
int id[N], col[N];
35+
ll ans[N];
36+
//http://codeforces.com/contest/600/problem/E
37+
//Notice how ids of u and v swap due to &
38+
void merge(int &u, int &v){
39+
if ((int)cnt[u].size() > (int)cnt[v].size()) swap(u, v);
40+
for (auto it: cnt[u]){
41+
int c = it.F; int occ = it.S;
42+
val[v][cnt[v][c]] -= c;
43+
cnt[v][c] += occ;
44+
val[v][cnt[v][c]] += c;
45+
}
46+
}
47+
void dfs(int u, int par){
48+
id[u] = u;
49+
cnt[u][col[u]] = 1;
50+
val[u][1] = col[u];
51+
for(int v: g[u]){
52+
if (v == par) continue;
53+
dfs(v, u);
54+
merge(id[v], id[u]);
55+
}
56+
ans[u] = val[id[u]].rbegin()->S;
57+
}
58+
//END
59+
int main()
60+
{
61+
ios_base::sync_with_stdio(false);
62+
cin.tie(NULL);
63+
int i,n,k,j, u, v;
64+
cin>>n;
65+
fo(i, n) cin>>col[i+1];
66+
fo(i, n-1){
67+
cin>>u>>v;
68+
g[u].pb(v);
69+
g[v].pb(u);
70+
}
71+
dfs(1, 0);
72+
Fo(i, 1, n+1) cout<<ans[i]<<" ";
73+
return 0;
74+
}
75+

0 commit comments

Comments
 (0)