1 条题解
-
0
80分超时无启发式:
#include<bits/stdc++.h> using namespace std; const int N=2e5+10; vector<int>G[N]; int n,id,dfn[N],_dfn[N],siz[N],col[N],cnt[N],tot,ans,mx; void dfs1(int x) { dfn[x]=++id;_dfn[id]=x; siz[x]=1; for(int y:G[x]) { dfs1(y); siz[x]+=siz[y]; } } void add(int x){cnt[col[x]]++;if(cnt[col[x]]==1)tot++;mx=max(mx,cnt[col[x]]);} void del(int x){cnt[col[x]]--;if(cnt[col[x]]==0)tot--;} void dfs2(int x) { for(int y:G[x])dfs2(y); mx=0; for(int i=0;i<siz[x];i++) add(_dfn[dfn[x]+i]); ans+=(siz[x]==tot*mx); for(int i=0;i<siz[x];i++) del(_dfn[dfn[x]+i]); } int main() { scanf("%d",&n); for(int i=1,x,y; i<=n; i++) { scanf("%d%d",&col[i],&x); G[x].push_back(i); } id=0;dfs1(1); tot=ans=0;dfs2(1); printf("%d",ans); return 0; }标准程序:
#include<bits/stdc++.h> using namespace std; const int N=2e5+10; vector<int>G[N]; int n,id,dfn[N],_dfn[N],siz[N],son[N],col[N],cnt[N],tot,ans,mx; void dfs1(int x) { dfn[x]=++id;_dfn[id]=x; siz[x]=1;son[x]=0; for(int y:G[x]) { dfs1(y); siz[x]+=siz[y]; if(siz[son[x]]<siz[y])son[x]=y; } } void add(int x){cnt[col[x]]++;if(cnt[col[x]]==1)tot++;mx=max(mx,cnt[col[x]]);} void del(int x){cnt[col[x]]--;if(cnt[col[x]]==0)tot--;} void dfs2(int x,int fa) { for(int y:G[x])if(y!=son[x])dfs2(y,fa); if(son[x])dfs2(son[x],x); for(int i=0;i<siz[x];i++) { if(_dfn[dfn[x]+i]==son[x]){i=i+siz[son[x]]-1;continue;} add(_dfn[dfn[x]+i]); } ans+=(siz[x]==tot*mx); if(son[fa]!=x){for(int i=0;i<siz[x];i++) del(_dfn[dfn[x]+i]);mx=0,tot=0;} } int main() { scanf("%d",&n); for(int i=1,x,y; i<=n; i++) { scanf("%d%d",&col[i],&x); G[x].push_back(i); } id=0;dfs1(1); memset(cnt,0,sizeof(cnt)); tot=ans=0;dfs2(1,0); printf("%d",ans); return 0; }
- 1
信息
- ID
- 404
- 时间
- 300ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 302
- 已通过
- 67
- 上传者