传送门

据大佬说这玩意儿好像叫灾难树还是灭绝树?

我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边

以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是羊的灭绝还是牛的灭绝都不会导致人的灭绝,会导致人灭绝的只有草,也就是羊和牛的LCA

(严格来说这个应该不叫LCA,不过反正这是一个有向无环图,大家能理解就好)

于是我们把人挂到草的下面,表示只有草的灭绝会使人灭绝。

于是我们按拓扑序把每一个生物都依次加入灭绝树,然后一遍dfs,每一个生物的灾难值就是它的子树的大小减一

 //minamoto
#include<iostream>
#include<cstdio>
using namespace std;
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
int read(){
int res,f=;char ch;
while((ch=getc())>''||ch<'')(ch=='-')&&(f=-);
for(res=ch-'';(ch=getc())>=''&&ch<='';res=res*+ch-'');
return res;
}char sr[<<],z[];int C=-,Z=;
inline void Ot(){fwrite(sr,,C+,stdout),C=-;}
void print(int x){
if(C><<)Ot();if(x<)sr[++C]='-',x=-x;
while(z[++Z]=x%+,x/=);
while(sr[++C]=z[Z],--Z);sr[++C]='\n';
}
const int N=;
int head[N<<],Next[N<<],ver[N<<],tot,head1[N<<],ver1[N<<],Next1[N<<],tot1,head2[N<<],ver2[N<<],Next2[N<<],tot2;
inline void add(int u,int v){ver[++tot]=v,Next[tot]=head[u],head[u]=tot;}
inline void add1(int u,int v){ver1[++tot1]=v,Next1[tot1]=head1[u],head1[u]=tot1;}
inline void add2(int u,int v){ver2[++tot2]=v,Next2[tot2]=head2[u],head2[u]=tot2;}
int n,du[N],q[N],dep[N],fa[N][],ans[N];
void topo(){
int h=,t=;
for(int i=;i<=n;++i)if(!du[i])q[++t]=i;
while(h<=t){
int u=q[h++];
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(--du[v]==)q[++t]=v;
}
}
}
int LCA(int u,int v){
if(dep[u]<dep[v])swap(u,v);int k=dep[u]-dep[v];
for(int i=;i<;++i)
if((k>>i)&)u=fa[u][i];
if(u==v)return u;
for(int i=;i>=;--i)
if(fa[u][i]!=fa[v][i])u=fa[u][i],v=fa[v][i];
return fa[u][];
}
void dfs(int u){
for(int i=head2[u];i;i=Next2[i])
dfs(ver2[i]),ans[u]+=ans[ver2[i]];
++ans[u];
}
int main(){
// freopen("testdata.in","r",stdin);
n=read();
for(int i=,u;i<=n;++i){
while(true){
if((u=read())==)break;
++du[i],add1(i,u),add(u,i);
}
}
topo();
for(int i=;i<=n;++i){
int u=ver1[head1[q[i]]];
for(int j=head1[q[i]];j;j=Next1[j])u=LCA(u,ver1[j]);
add2(u,q[i]),dep[q[i]]=dep[u]+,fa[q[i]][]=u;
for(int j=;j<;++j)fa[q[i]][j]=fa[fa[q[i]][j-]][j-];
}
dfs();
for(int i=;i<=n;++i)print(ans[i]-);
return Ot(),;
}

最新文章

  1. .NET跨平台之旅:将示例站点从ASP.NET 5 Beta7升级至RC1
  2. macbook air 开机黑屏解决方法
  3. 双十一 VS 火车票(12306)
  4. 初识Spring框架
  5. Light OJ 1341 Aladdin and the Flying Carpet Pollard_rho整数分解+DFS
  6. 在 Linux 系统中安装Load Generator ,并在windows 调用方法
  7. c#一步一步实现ORM(二)
  8. Java并发编程的艺术&#183; 笔记(1)
  9. P3047 [USACO12FEB]附近的牛Nearby Cows
  10. 搜狗拼音输入法 V9.1.0.2589 最新去广告精简优化版
  11. C++STL stack
  12. 使用Codis-Admin命令配置环境
  13. 【Java】JVM(四)、虚拟机参数配置
  14. java求三角形面积以及周长---封装
  15. WPF备忘录(7)WPF图片资源路径介绍
  16. EOJ Monthly 2019.2 (based on February Selection) F.方差
  17. 在lampp的proftpd下新增FTP用户的方法与配置
  18. android 程序更新(没有sdcard)
  19. 用jQuery获取table中行id和td值
  20. swift对比object-c

热门文章

  1. c++中的string常用函数用法总结!
  2. Oracle导出txt文本文件
  3. noip模拟赛 轮换
  4. JS基础:函数
  5. 国王游戏(codevs 1198)
  6. Check ini style config tool
  7. GETTING STARTED WITH THE OTTO JAVASCRIPT INTERPRETER
  8. java STW stop the world 哈哈就是卡住了
  9. gcc 5.2.0 编译安装笔记-20151110
  10. nopcommerce 电商商城 ASP.NET 开源系统