Skip to content

Commit 5e6d2e0

Browse files
Merge pull request matthewsamuel95#877 from amulyagaur/patch-5
Code for HEDWIG problem on CodeChef using sack technique
2 parents 2ea317e + f98f203 commit 5e6d2e0

File tree

1 file changed

+100
-0
lines changed

1 file changed

+100
-0
lines changed

Graph/Sack/HEDWIG.cpp

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
#include <bits/stdc++.h>
2+
using namespace std;
3+
map<int,int> *freq[200005];
4+
map<int,int> *counter[200005];
5+
vector< vector<int> > g(200005);
6+
int color[200005];
7+
int fav[200005];
8+
int ans[200005];
9+
int dfs(int u,int par)
10+
{
11+
int mx=-1,mv=-1,v;
12+
for(int i=0;i<g[u].size();i++)
13+
{
14+
v= g[u][i];
15+
if(v==par)
16+
continue;
17+
int sz = dfs(v,u);
18+
if(sz>mx)
19+
{
20+
mx=sz;
21+
mv=v;
22+
}
23+
}
24+
if(mx!=-1)
25+
{
26+
freq[u]=freq[mv];
27+
counter[u]=counter[mv];
28+
}
29+
else
30+
{
31+
freq[u] = new map<int,int>();
32+
counter[u] = new map<int,int>();
33+
}
34+
35+
if((*freq[u]).find(color[u]) != (*freq[u]).end())
36+
{
37+
(*counter[u])[(*freq[u])[color[u]]]--;
38+
if((*counter[u])[(*freq[u])[color[u]]]==0)
39+
{
40+
(*counter[u]).erase((*freq[u])[color[u]]);
41+
}
42+
(*freq[u])[color[u]]++;
43+
(*counter[u])[(*freq[u])[color[u]]]++;
44+
}
45+
else
46+
{
47+
(*freq[u])[color[u]]++;
48+
(*counter[u])[(*freq[u])[color[u]]]++;
49+
}
50+
for(int i=0;i<g[u].size();i++)
51+
{
52+
v= g[u][i];
53+
if(v==par)
54+
continue;
55+
if(v!= mv && v!= par)
56+
{
57+
for(auto it=(*freq[v]).begin();it!= (*freq[v]).end();it++)
58+
{
59+
if((*freq[u]).find(it->first) != (*freq[u]).end())
60+
{
61+
(*counter[u])[(*freq[u])[it->first]]--;
62+
if((*counter[u])[(*freq[u])[it->first]]==0)
63+
{
64+
(*counter[u]).erase((*freq[u])[it->first]);
65+
}
66+
(*freq[u])[it->first] += it->second;
67+
(*counter[u])[(*freq[u])[it->first]]++;
68+
}
69+
else
70+
{
71+
(*freq[u])[it->first] = it->second;
72+
(*counter[u])[it->second]++;
73+
}
74+
}
75+
}
76+
77+
}
78+
if((*counter[u]).find(fav[u]) != (*counter[u]).end())
79+
ans[u]= (*counter[u])[fav[u]];
80+
return (int)(*freq[u]).size();
81+
}
82+
83+
int main()
84+
{
85+
int n;
86+
scanf("%d",&n);
87+
for(int i=1;i<=n;i++) scanf("%d",&color[i]);
88+
for(int i=1;i<=n;i++) scanf("%d",&fav[i]);
89+
for(int i=1;i<n;i++)
90+
{
91+
int u,v;
92+
scanf("%d %d",&u,&v);
93+
g[u].push_back(v);
94+
g[v].push_back(u);
95+
}
96+
int sz=dfs(1,0);
97+
for(int i=1;i<=n;i++)
98+
printf("%d\n",ans[i]);
99+
return 0;
100+
}

0 commit comments

Comments
 (0)