1
+ Problem- TREEPREM
2
+
3
+ #include < bits/stdc++.h>
4
+ using namespace std ;
5
+ const long long mod = 1000000007 ;
6
+ vector<long long > graph[100001 ];
7
+ long long A[1000001 ];
8
+ long long B[1000001 ];
9
+ long long con[1000001 ];
10
+ long long a[100001 ];
11
+ long long b[100001 ];
12
+ long long par[100001 ];
13
+ long long h[100001 ];
14
+ long long vis[100001 ];
15
+ vector<long long > sset;
16
+ priority_queue<pair<long long ,long long > > LT;
17
+ long long n,s;
18
+ long long TEMP;
19
+ void solve1 (long long SUP,long long d)
20
+ {
21
+ vis[SUP]++;
22
+ h[SUP] = d;
23
+ bool is_it = true ;
24
+ for (long long CHD:graph[SUP])
25
+ {
26
+ if (!vis[CHD])
27
+ {
28
+ par[CHD] = SUP;
29
+ solve1 (CHD,d+1 );
30
+ is_it = false ;
31
+ }
32
+ }
33
+ if (is_it==true )
34
+ LT.push ({d,SUP});
35
+ }
36
+ void done ()
37
+ {
38
+ for (long long i=0 ;i<n+1 ;i++)
39
+ {
40
+ graph[i].clear ();
41
+ a[i] = 0 ;
42
+ b[i] = 0 ;
43
+ par[i] = 0 ;
44
+ h[i] = 0 ;
45
+ }
46
+ while (!LT.empty ())
47
+ LT.pop ();
48
+ }
49
+ void clean (long long SUP)
50
+ {
51
+ con[a[SUP]] = 0 ;
52
+ con[b[SUP]] = 0 ;
53
+ A[a[SUP]] = 0 ;
54
+ A[b[SUP]] = 0 ;
55
+ B[a[SUP]] = 0 ;
56
+ B[b[SUP]] = 0 ;
57
+ }
58
+ int solve2 (long long SUP)
59
+ {
60
+ B[b[SUP]]++;
61
+ A[a[SUP]]++;
62
+ if (A[a[SUP]]==B[a[SUP]] && con[a[SUP]]!=0 )
63
+ {
64
+ con[a[SUP]]--;
65
+ TEMP--;
66
+ }
67
+ else if (con[a[SUP]]==0 )
68
+ {
69
+ con[a[SUP]]++;
70
+ TEMP++;
71
+ }
72
+ if (A[b[SUP]]==B[b[SUP]] && con[b[SUP]]!=0 )
73
+ {
74
+ con[b[SUP]]--;
75
+ TEMP--;
76
+ }
77
+ else if (con[b[SUP]]==0 )
78
+ {
79
+ con[b[SUP]]++;
80
+ TEMP++;
81
+ }
82
+ vis[SUP]++;
83
+ sset.push_back (SUP);
84
+ if (TEMP==0 )
85
+ {
86
+ if (vis[par[SUP]]==0 && SUP!=1 )
87
+ LT.push (make_pair (h[par[SUP]], par[SUP]));
88
+ clean (SUP);
89
+ return 1 ;
90
+ }
91
+ if (SUP==1 )
92
+ {
93
+ clean (SUP);
94
+ return 0 ;
95
+ }
96
+ if (vis[par[SUP]]==0 )
97
+ {
98
+ if (solve2 (par[SUP])==1 )
99
+ {
100
+ clean (SUP);
101
+ return 1 ;
102
+ }
103
+ }
104
+ clean (SUP);
105
+ return 0 ;
106
+ }
107
+ int sol ()
108
+ {
109
+ cin>>n>>s;
110
+ for (long long i=0 ;i<n-1 ;i++)
111
+ {
112
+ long long u,v;
113
+ cin>>u>>v;
114
+ graph[u].push_back (v);
115
+ graph[v].push_back (u);
116
+ }
117
+ for (long long i=1 ;i<n+1 ;i++)
118
+ cin>>a[i];
119
+ for (long long i=1 ;i<n+1 ;i++)
120
+ cin>>b[i];
121
+ for (long long i=1 ;i<n+1 ;i++)
122
+ {
123
+ vis[i] = 0 ;
124
+ par[i] = 0 ;
125
+ h[i] = 0 ;
126
+ }
127
+ solve1 (1 ,1 );
128
+ for (long long i=1 ;i<n+1 ;i++)
129
+ vis[i]=0 ;
130
+ bool correct = true ;
131
+ vector<vector<long long > > sets;
132
+ while (!LT.empty ())
133
+ {
134
+ pair<long long ,long long > leaf = LT.top ();
135
+ LT.pop ();
136
+ if (vis[leaf.second ]==0 )
137
+ {
138
+ TEMP = 0 ;
139
+ sset.clear ();
140
+ if (solve2 (leaf.second )==0 )
141
+ {
142
+ correct = false ;
143
+ break ;
144
+ }
145
+ else
146
+ sets.push_back (sset);
147
+ }
148
+ }
149
+ if (correct==false )
150
+ {
151
+ cout<<0 <<endl;
152
+ return 0 ;
153
+ }
154
+ if (s==1 )
155
+ {
156
+ cout<<1 <<endl;
157
+ return 0 ;
158
+ }
159
+ long long a = 1 ;
160
+ long long x = sets.size ();
161
+ for (long long i=0 ;i<x;i++)
162
+ {
163
+ long long u = sets[i][0 ];
164
+ long long l = sets[i][0 ];
165
+ long long sze = sets[i].size ();
166
+ for (long long j=1 ;j<sze;j++)
167
+ {
168
+ if (h[sets[i][j]]>h[l])
169
+ l = sets[i][j];
170
+ if (h[sets[i][j]]<h[u])
171
+ u = sets[i][j];
172
+ }
173
+ long long cnt = 0 ;
174
+ for (long long c: graph[l])
175
+ {
176
+ if (c!=par[l])
177
+ cnt++;
178
+ }
179
+ a = (a*(cnt+1 ))%mod;
180
+ }
181
+ cout<<a<<endl;
182
+ return 0 ;
183
+ }
184
+ int main ()
185
+ {
186
+ ios_base::sync_with_stdio (0 );cin.tie (0 );cout.tie (0 );
187
+ long long T;
188
+ cin>>T;
189
+ for (long long i=0 ;i<T;i++)
190
+ {
191
+ sol ();
192
+ done ();
193
+ }
194
+ return 0 ;
195
+ }
0 commit comments