题解:

构造灭绝树;

x指向的点表示x的祖先死亡则x死亡

动态LCA;

可以用LCT维护或直接更新倍增数组

最后统计子树点的个数

坑:

  我还不会序列型Toposort

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int maxn=100000; int n;
vector<int>G[maxn];
vector<int>G2[maxn]; int cntedge;
int head[maxn];
int to[maxn<<1],nex[maxn<<1];
int addedge(int x,int y){
nex[++cntedge]=head[x];
to[cntedge]=y;
head[x]=cntedge;
} int f[maxn][20];
int depth[maxn];
int Lcainit(int i,int fa){
f[i][0]=fa;depth[i]=depth[fa]+1;
for(int j=1;j<=19;++j){
f[i][j]=f[f[i][j-1]][j-1];
}
} int Getlca(int x,int y){
if(depth[x]<depth[y])swap(x,y);
for(int j=19;j>=0;--j){
if(depth[f[x][j]]>=depth[y]){
x=f[x][j];
}
}
if(x==y)return x;
for(int j=19;j>=0;--j){
if(f[x][j]!=f[y][j]){
x=f[x][j];y=f[y][j];
}
}
return f[x][0];
} int root;
int indegree[maxn];
int sta[maxn],top;
int lca[maxn];
int Toposort(){
for(int i=1;i<=n;++i){
if(indegree[i]==0){
sta[++top]=i;
Lcainit(i,root);
G2[root].push_back(i);
}
}
while(top){
int x=sta[top--];
for(int i=head[x];i;i=nex[i]){
--indegree[to[i]];
if(indegree[to[i]]==0){
sta[++top]=to[i];
for(int j=0;j<G[to[i]].size();++j){
int v=G[to[i]][j];
if(lca[to[i]]==0){
lca[to[i]]=v;
}else{
lca[to[i]]=Getlca(lca[to[i]],v);
}
}
Lcainit(to[i],lca[to[i]]);
G2[lca[to[i]]].push_back(to[i]);
}
}
}
} int siz[maxn];
int dfs(int now,int fa){
siz[now]=1;
for(int i=0;i<G2[now].size();++i){
int v=G2[now][i];
if(v==fa)continue;
dfs(v,now);
siz[now]+=siz[v];
}
} void minit(){
for(int i=1;i<=n+1;++i){
G[i].clear();G2[i].clear();
}
cntedge=top=0;
memset(head,0,sizeof(head));
memset(f,0,sizeof(f));
memset(indegree,0,sizeof(indegree));
memset(lca,0,sizeof(lca));
}
int main(){
scanf("%d",&n);
minit();
root=n+1;depth[root]=1;
for(int i=1;i<=n;++i){
int x;
scanf("%d",&x);
while(x){
G[i].push_back(x);
addedge(x,i);
indegree[i]++;
scanf("%d",&x);
}
}
Toposort();
dfs(root,0);
for(int i=1;i<=n;++i)printf("%d\n",siz[i]-1);
return 0;
}

  

BZOJ:2815: [ZJOI2012]灾难的更多相关文章

  1. BZOJ 2815: [ZJOI2012]灾难

    呃,题面没了,大概就是给出一些生物之间的捕食关系,求灭绝树每个点的灾难值. 拓扑排序之后倒着加入点,动态维护fa[][]数组,倍增法求LCA,当然大佬愿意写动态树也是极好的…… #include &l ...

  2. bzoj 2815 [ZJOI2012]灾难(构造,树形DP)

    [题意] 求把每个点删除后,不可达点的数目. [思路] 构造一棵“灭绝树”,要求这棵树满足如果删除根节点后则该子树内的所有结点都不可达.则答案为子树大小-1. 如何构造这棵“灭绝树”? 将原图拓扑排序 ...

  3. BZOJ 2815: [ZJOI2012]灾难 拓扑排序+倍增LCA

    这种问题的转化方式挺巧妙的. Code: #include <bits/stdc++.h> #define N 100000 #define M 1000000 #define setIO ...

  4. 2815: [ZJOI2012]灾难 - BZOJ

    题目描述 Description 阿米巴是小强的好朋友.    阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 ...

  5. 【BZOJ】2815: [ZJOI2012]灾难

    简要题意: 给一个有向无环图,问每个节点删掉之后会导致多少个点不可达. 似乎以前拿来考过.... 我们定义一棵树,它满足对应点造成的灭绝值即为当点的子树大小-1 按照被捕食者--->捕食者的关系 ...

  6. BZOJ2815: [ZJOI2012]灾难

    传送门 学LCA的时候根本没意识到LCA可以有这么多玩法. 这玩意据说是个高级数据结构(支配树)的弱化版,蒟蒻没学过呀.所以出题人提出一个概念叫灾难树. 我理解的灾难树的意思实际上是属于DAG的一个子 ...

  7. 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA

    [BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...

  8. Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造

    Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...

  9. [洛谷P2597] [ZJOI2012]灾难

    洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...

随机推荐

  1. 洛谷 P1886 滑动窗口 /【模板】单调队列

    纯板子题,入队时保证单调性,即单调栈,出队保证题目条件,本题即窗口长度k,在入队出队时都可以维护信息 ; int buf[maxm], maxq[maxm], minq[maxm], ans1[max ...

  2. 统计学习方法——KD树最近邻搜索

    李航老师书上的的算法说明没怎么看懂,看了网上的博客,悟出一套循环(建立好KD树以后的最近邻搜索),我想应该是这样的(例子是李航<统计学习算法>第三章56页:例3.3): 步骤 结点查询标记 ...

  3. Android按返回键退出程序

    既然想实现 按两次返回键 退出程序 有两个关键词 一个是 “返回键”,再一个是“退出程序” )先说“退出” 退出相信大家都会 finish(); System.exit(); 为了确保不出现问题,两种 ...

  4. 线程与IO

    pread/pwrite 定位和读取成为原子操作

  5. postgres 删除外部表

    drop external table if exists tableName;

  6. ffmpeg 学习:001-搭建开发环境

    介绍 由于命令行的ffmpeg工具无法满足产品的性能要求,需要对视频流进行兼容.所以需要调试有关的参数. FFmpeg全名是Fast Forward MPEG(Moving Picture Exper ...

  7. Jmockit如何同时mock多个类的静态方法

    使用Jmockit来mock类的静态方法,网上有很多mock单个类静态方法的例子.有使用Expectations,还有使用MockUp的. 但是如果想在一个测试方法中mock多个类的静态方法,该怎么写 ...

  8. C#遍历DataSet

    ] foreach (DataRow dr in dt.Rows) ///遍历所有的行 foreach (DataColumn dc in dt.Columns) //遍历所有的列 Console.W ...

  9. vue+element 递归上传图片

    直接上代码. <template>   <div>     <el-upload       action="http://localhost:3000/pic ...

  10. SQL state [72000]; error code [1461]; ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 ; nested exception is java.sql.BatchUpdateException: ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值

    本文转自  https://www.cnblogs.com/yingsong/p/5685790.html 原 因:某一个字段本为varchar2(1024),但是实际要插入的值超过varchar2允 ...