Submission #52926899
Source Code Expand
#include <bits/stdc++.h>
#include <atcoder/modint>
const int MOD = 998244353;
using mint = atcoder::static_modint<MOD>;
using namespace std;
typedef long long ll;
#define rep(i, a, n) for (ll i = a; i < (ll)(n); i++)
#define per(i, a, n) for (ll i = n; i-- > (ll)(a);)
ll read() { ll r; scanf("%lld", &r); return r; }
#define N 200010
int a[N];
vector<int> e[N];
int sz[N],fa[N],dep[N];
void dfs1(int u,int F) {
per(i,0,size(e[u])) if(e[u][i]==F) {
swap(e[u][i],e[u].back());
e[u].pop_back();
}
sz[u]=1;
dep[u]=dep[fa[u]=F]+1;
rep(i,0,size(e[u])) {
int v=e[u][i];
dfs1(v,u);
sz[u]+=sz[v];
if(sz[v]>sz[e[u][0]]) swap(e[u][0],e[u][i]); // 重儿子, size
}
}
int dfn[N],root[N];
void dfs2(int u,int R,int &cur) {
dfn[u]=cur++; // dfs number
root[u]=R;
if(sz[u] == 1) return; // 叶子
dfs2(e[u][0],R,cur); // 重儿子
rep(i,1,size(e[u])) dfs2(e[u][i],e[u][i],cur); // 轻儿子
}
int lca(int u,int v) {
for(;root[u]!=root[v];u=fa[root[u]]) if(dep[root[u]]<dep[root[v]]) swap(u,v);
return dep[u]<dep[v]?u:v; // u,v在一条重链上
}
vector<int> eg[N];
vector<int> fake(vector<int> v) {
auto cmp=[&](int x,int y){return dfn[x]<dfn[y];};
vector<int> ans=v;
sort(v.begin(),v.end(),cmp); // 按照 dfs序 sort
rep(i,1,size(v)) ans.push_back(lca(v[i-1],v[i])); // dfn相邻的lca
ans.push_back(1); // 根节点, 加了简化处理不影响结果
sort(ans.begin(),ans.end(),cmp);
ans.resize(unique(ans.begin(),ans.end())-ans.begin()); // 去重
rep(i,1,size(ans)) eg[lca(ans[i-1],ans[i])].push_back(ans[i]);
return ans;
}
mint f[N];
void dfs(int x,int C,mint&ans) {
f[x]=1;
mint tot=0; // 单儿子的方案和, 在根非颜色时 不贡献
for(auto i:eg[x]) {
dfs(i,C,ans);
tot+=f[i];
f[x]*=(f[i]+1);
}
if(a[x]!=C){
f[x]-=1;
ans+=f[x]-tot;
}else{
ans+=f[x];
}
}
vector<int> c2i[N]; // color to index
int main() {
int n=read();
rep(i,1,n+1) {
a[i]=read();
c2i[a[i]].push_back(i);
}
rep(i,1,n) {
int u=read();
int v=read();
e[u].push_back(v);
e[v].push_back(u);
}
dfs1(1,0); // 父节点, 子树大小, 深度, 重儿子
int cur=0;
dfs2(1,1,cur); // 处理重链
mint ans=0;
rep(i,1,n+1) if(c2i[i].size()) {
vector<int> v=fake(c2i[i]);
dfs(1,i,ans);
for(auto j:v) eg[j].clear();
}
printf("%d",ans.val());
return 0;
}
Submission Info
| Submission Time |
|
| Task |
G - Leaf Color |
| User |
cromarmot |
| Language |
C++ 20 (gcc 12.2) |
| Score |
600 |
| Code Size |
2383 Byte |
| Status |
AC |
| Exec Time |
162 ms |
| Memory |
48076 KiB |
Compile Error
Main.cpp: In function ‘ll read()’:
Main.cpp:11:24: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result]
11 | ll read() { ll r; scanf("%lld", &r); return r; }
| ~~~~~^~~~~~~~~~~~
Judge Result
| Set Name |
Sample |
All |
| Score / Max Score |
0 / 0 |
600 / 600 |
| Status |
|
|
| Set Name |
Test Cases |
| Sample |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt |
| All |
00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_small_00.txt, 01_small_01.txt, 01_small_02.txt, 01_small_03.txt, 01_small_04.txt, 01_small_05.txt, 01_small_06.txt, 01_small_07.txt, 01_small_08.txt, 01_small_09.txt, 02_random_00.txt, 02_random_01.txt, 02_random_02.txt, 02_random_03.txt, 02_random_04.txt, 02_random_05.txt, 02_random_06.txt, 02_random_07.txt, 02_random_08.txt, 02_random_09.txt, 02_random_10.txt, 02_random_11.txt, 02_random_12.txt, 02_random_13.txt, 02_random_14.txt, 02_random_15.txt, 02_random_16.txt, 02_random_17.txt, 02_random_18.txt, 02_random_19.txt, 02_random_20.txt, 02_random_21.txt, 02_random_22.txt, 02_random_23.txt, 02_random_24.txt, 02_random_25.txt, 02_random_26.txt, 02_random_27.txt, 02_random_28.txt, 02_random_29.txt, 03_star_00.txt, 03_star_01.txt, 03_star_02.txt, 03_star_03.txt, 03_star_04.txt, 04_path_00.txt, 04_path_01.txt, 04_path_02.txt, 04_path_03.txt, 04_path_04.txt, 05_corner_00.txt, 05_corner_01.txt |
| Case Name |
Status |
Exec Time |
Memory |
| 00_sample_00.txt |
AC |
3 ms |
4568 KiB |
| 00_sample_01.txt |
AC |
3 ms |
4496 KiB |
| 00_sample_02.txt |
AC |
3 ms |
4436 KiB |
| 01_small_00.txt |
AC |
3 ms |
4568 KiB |
| 01_small_01.txt |
AC |
3 ms |
4636 KiB |
| 01_small_02.txt |
AC |
3 ms |
4568 KiB |
| 01_small_03.txt |
AC |
3 ms |
4504 KiB |
| 01_small_04.txt |
AC |
3 ms |
4480 KiB |
| 01_small_05.txt |
AC |
3 ms |
4504 KiB |
| 01_small_06.txt |
AC |
3 ms |
4480 KiB |
| 01_small_07.txt |
AC |
3 ms |
4440 KiB |
| 01_small_08.txt |
AC |
3 ms |
4656 KiB |
| 01_small_09.txt |
AC |
3 ms |
4656 KiB |
| 02_random_00.txt |
AC |
78 ms |
17332 KiB |
| 02_random_01.txt |
AC |
145 ms |
26692 KiB |
| 02_random_02.txt |
AC |
143 ms |
26640 KiB |
| 02_random_03.txt |
AC |
145 ms |
26588 KiB |
| 02_random_04.txt |
AC |
71 ms |
16124 KiB |
| 02_random_05.txt |
AC |
158 ms |
28020 KiB |
| 02_random_06.txt |
AC |
145 ms |
26736 KiB |
| 02_random_07.txt |
AC |
154 ms |
27244 KiB |
| 02_random_08.txt |
AC |
112 ms |
22120 KiB |
| 02_random_09.txt |
AC |
158 ms |
31616 KiB |
| 02_random_10.txt |
AC |
144 ms |
26568 KiB |
| 02_random_11.txt |
AC |
150 ms |
26644 KiB |
| 02_random_12.txt |
AC |
20 ms |
7768 KiB |
| 02_random_13.txt |
AC |
152 ms |
26512 KiB |
| 02_random_14.txt |
AC |
143 ms |
27260 KiB |
| 02_random_15.txt |
AC |
143 ms |
26772 KiB |
| 02_random_16.txt |
AC |
128 ms |
23588 KiB |
| 02_random_17.txt |
AC |
148 ms |
28236 KiB |
| 02_random_18.txt |
AC |
162 ms |
29988 KiB |
| 02_random_19.txt |
AC |
147 ms |
26504 KiB |
| 02_random_20.txt |
AC |
15 ms |
7224 KiB |
| 02_random_21.txt |
AC |
159 ms |
28336 KiB |
| 02_random_22.txt |
AC |
157 ms |
31592 KiB |
| 02_random_23.txt |
AC |
154 ms |
27392 KiB |
| 02_random_24.txt |
AC |
43 ms |
12112 KiB |
| 02_random_25.txt |
AC |
154 ms |
26984 KiB |
| 02_random_26.txt |
AC |
150 ms |
26728 KiB |
| 02_random_27.txt |
AC |
160 ms |
28176 KiB |
| 02_random_28.txt |
AC |
17 ms |
7416 KiB |
| 02_random_29.txt |
AC |
145 ms |
26432 KiB |
| 03_star_00.txt |
AC |
103 ms |
23480 KiB |
| 03_star_01.txt |
AC |
92 ms |
21640 KiB |
| 03_star_02.txt |
AC |
88 ms |
22104 KiB |
| 03_star_03.txt |
AC |
95 ms |
22764 KiB |
| 03_star_04.txt |
AC |
87 ms |
22036 KiB |
| 04_path_00.txt |
AC |
109 ms |
47656 KiB |
| 04_path_01.txt |
AC |
139 ms |
48076 KiB |
| 04_path_02.txt |
AC |
96 ms |
47908 KiB |
| 04_path_03.txt |
AC |
141 ms |
46548 KiB |
| 04_path_04.txt |
AC |
106 ms |
47820 KiB |
| 05_corner_00.txt |
AC |
83 ms |
46636 KiB |
| 05_corner_01.txt |
AC |
105 ms |
25232 KiB |