1 条题解
-
0
自动搬运
来自洛谷,原作者为

momentous
鹌鹑吃dak!(误搬运于
2025-08-24 22:01:59,当前版本为作者最后更新于2019-07-19 14:54:48,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
这道题的恶心内存与恶心数据导致存图
只不只能用链式前向星(个人不常用STL),于是......永远喜欢链式前向星!!!
Code:
#include<cstdio> #define reg register #define ll long long using namespace std; inline int Read(){//快读,优化时间 reg int x=0,f=1;reg char ch=getchar(); while((ch<'0' || ch>'9') && ch!='-') ch=getchar(); if(ch=='-') f=-1,ch=getchar(); while(ch>='0' && ch<='9'){ x=(x<<3)+(x<<1)+(ch&15); ch=getchar(); } return x*f; } inline void Print(const ll x){//快输,也是优化时间 if(x<0){putchar('-');Print(-x);} if(x<10) putchar(x+48); else{Print(x/10);putchar(x%10+48);} } inline void Println(const ll x){Print(x);putchar('\n');} ll b[200105],c[200105]; int n,head[200105],top;//上司关系不会超过人数,所以可以用int struct p{ int to,nxt; }e[200105];//链式前向星存图 inline void dfs(const int Number){ b[Number]=1; for(reg int i=head[Number];i;i=e[i].nxt){ reg int some=e[i].to; dfs(some);//统计他的助手 c[Number]+=c[some]; b[Number]+=b[some]; } c[Number]+=b[Number]; } inline void add(int u,int v){//链式前向星建边 e[++top].to=v; e[top].nxt=head[u]; head[u]=top; } int main(){ n=Read(); for(reg int i=2;i<=n;++i){ reg int x=Read(); add(x,i); } dfs(1);//慢慢统计吧...... for(reg int i=1;i<=n;++i){ Print(c[i]);putchar(' '); } putchar('\n'); return 0; }链式前向星是解决图论问题的利器,大家一定要学会哦
- 1
信息
- ID
- 3583
- 时间
- 1000ms
- 内存
- 63MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者