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
AC × 3
AC × 55
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