RT,有没有知道以下两种代码的区别在哪里
#include <bits/stdc++.h>
#define mp make_pair
#define pb emplace_back
#define endl "\n"
using namespace std;
using ll = long long;
int n,t,cnt=0,totCol=0;
const int maxn=2e5+10;
int head[maxn];
struct{int from,to,next;}edge[maxn];
inline void add(int u, int v){
edge[cnt].from=u;edge[cnt].to=v;edge[cnt].next=head[u];
head[u]=cnt++;
}
inline void init(){for(int i=1;i<=n;i++)edge[i].next=head[i]=-1;}
int siz[maxn],big[maxn];
int L[maxn],R[maxn],Node[maxn],cmt[maxn],arr[maxn],ans[maxn];
void dfs1(int u, int from){
L[u]=++cnt;
Node[cnt]=u;
siz[u]=1;
int ma=0;
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(v!=from){
dfs1(v,u);
siz[u]+=siz[v];
if(siz[v]>ma){
big[u]=v;
ma=siz[v];
}
}
}
R[u]=cnt;
}
void dfs2(int u, int from, bool keep){
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(v!=from && v!=big[u]){
dfs2(v,u,0);
}
}
if(big[u]){
dfs2(big[u],u,1);
}
for(int i=head[u];~i;i=edge[i].next){
int v=edge[i].to;
if(v!=from && v!=big[u]){
for(int i=L[v];i<=R[v];i++){
if(cmt[arr[Node[i]]]==0) ++totCol;
cmt[arr[Node[i]]]++;
}
}
}
if(cmt[arr[u]]==0) ++totCol;
cmt[arr[u]]++;
ans[u]=totCol;
if(!keep){
for(int i=L[u];i<=R[u];i++){
cmt[arr[Node[i]]]--;
if(cmt[arr[Node[i]]]==0) --totCol;
}
}
}
signed main(){
cin.tie(nullptr)->sync_with_stdio(0);
cin>>n;
init();
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
add(u,v);add(v,u);
}
for(int i=1;i<=n;i++){
cin>>arr[i];
}
dfs1(1,0);
dfs2(1,0,0);
for(int i=1;i<=n;i++) cout<<ans[i]<<endl;
return 0;
}
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int color[100010];
int h[100010],e[200010],ne[200010],idx;
void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int f[100010];
int son[100010];
int big[100010];
int l[100010],r[100010],p[100010],times;
void dfs(int u,int fa){
son[u]=1;
l[u]=++times;
p[times]=u;
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa) continue;
dfs(j,u);
son[u]+=son[j];
if(son[big[u]]<son[j]) big[u]=j;
}
r[u]=times;
}
int sum;
int cnt[100010];
void add(int u){
if(++cnt[color[u]]==1) sum++;
}
void dfs2(int u,int fa,bool keep){
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa || big[u]==j) continue;
dfs2(j,u,false);
}
if(big[u]) dfs2(big[u],u,true);
add(u);
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(j==fa || big[u]==j) continue;
for(int k=l[j];k<=r[j];k++) add(p[k]);
}
f[u]=sum;
if(!keep){
sum=0;
for(int i=l[u];i<=r[u];i++) cnt[color[p[i]]]=0;
}
}
int main(){
int n;
scanf("%d",&n);
memset(h,-1,sizeof h);
for(int i=1;i<n;i++){
int a,b;
scanf("%d %d",&a,&b);
add(a,b),add(b,a);
}
for(int i=1;i<=n;i++) scanf("%d",&color[i]);
dfs(1,1);
dfs2(1,1,false);
for(int i=1;i<=n;i++) printf("%d\n",f[i]);
return 0;
}
题目:U464326
用代码 1 造了数据放到代码 2 跑,喜提 WA,求解释。
同时求学习 dsu on tree 较好的大神笔记。