BZOJ:2815: [ZJOI2012]灾难
题解:
构造灭绝树;
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]灾难的更多相关文章
- BZOJ 2815: [ZJOI2012]灾难
呃,题面没了,大概就是给出一些生物之间的捕食关系,求灭绝树每个点的灾难值. 拓扑排序之后倒着加入点,动态维护fa[][]数组,倍增法求LCA,当然大佬愿意写动态树也是极好的…… #include &l ...
- bzoj 2815 [ZJOI2012]灾难(构造,树形DP)
[题意] 求把每个点删除后,不可达点的数目. [思路] 构造一棵“灭绝树”,要求这棵树满足如果删除根节点后则该子树内的所有结点都不可达.则答案为子树大小-1. 如何构造这棵“灭绝树”? 将原图拓扑排序 ...
- BZOJ 2815: [ZJOI2012]灾难 拓扑排序+倍增LCA
这种问题的转化方式挺巧妙的. Code: #include <bits/stdc++.h> #define N 100000 #define M 1000000 #define setIO ...
- 2815: [ZJOI2012]灾难 - BZOJ
题目描述 Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 ...
- 【BZOJ】2815: [ZJOI2012]灾难
简要题意: 给一个有向无环图,问每个节点删掉之后会导致多少个点不可达. 似乎以前拿来考过.... 我们定义一棵树,它满足对应点造成的灭绝值即为当点的子树大小-1 按照被捕食者--->捕食者的关系 ...
- BZOJ2815: [ZJOI2012]灾难
传送门 学LCA的时候根本没意识到LCA可以有这么多玩法. 这玩意据说是个高级数据结构(支配树)的弱化版,蒟蒻没学过呀.所以出题人提出一个概念叫灾难树. 我理解的灾难树的意思实际上是属于DAG的一个子 ...
- 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA
[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...
- Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造
Luogu_2597_[ZJOI2012]灾难 倍增lca + 构造 题意: 我们用一种叫做食物网的有向图来描述生物之间的关系:一个食物网有N个点,代表N种生物,如果生物x可以吃生物y,那么从y向x连 ...
- [洛谷P2597] [ZJOI2012]灾难
洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...
随机推荐
- PhpStorm 10.0.1破解激活步骤
1.下载破解补丁 链接:https://pan.baidu.com/s/1S4JVKiaFnCZG01MpDPaAAA 密码:c6x6 放到phpstorm安装目录下的lib文件夹下: C:\soft ...
- SQL Server DATEADD() 函数 一步步使用教程
SQL Server DATEADD() 函数 DATEADD() 函数在日期中添加或减去指定的时间间隔. DATEADD(datepart,number,date)date 参数是合法的日期表达式. ...
- Lesson 48 Planning a share portfolio
How does the older investor differ in his approach to investment from the younger investor? There is ...
- CSS-font
font:[ [ <' font-style '> || <' font-variant '> || <' font-weight '> ]? <' font ...
- 【QSBOJ】字符串编辑
题目链接:https://bbs.csdn.net/topics/390289884?page=1 AC代码: #include<bits/stdc++.h> using namespac ...
- Matplotlib 入门
章节 Matplotlib 安装 Matplotlib 入门 Matplotlib 基本概念 Matplotlib 图形绘制 Matplotlib 多个图形 Matplotlib 其他类型图形 Mat ...
- 初学微信小程序——配置问题(1)
一.注册: 微信小程序账号注册:登录https://mp.weixin.qq.com 点击“立即注册”->”小程序” 注册完成后,下载微信小程序开发者工具: 依次点击:“首页”->“文档 ...
- springboot2.1以javabean整合rabbitmq及自动注入rabbitmqTemplate为空问题
springboot集成rabbitmq之前也写过,这次再来个总结,总体来讲比较简单 主要就是配置属性文件,将属性以javabean的形式注入,配置工厂,对象等原来以xml<bean>形式 ...
- R分析实现对招聘网站薪资预测分析
1.首先确定数据分析目标——薪酬受哪些因素影响 确定变量: 因变量:薪资 自变量:(定性)-- 公司类别.公司规模.地区.行业类别.学历要求.软件要求. (定量)-- 经验要求(数值型) 分析目标:建 ...
- Luogu神贴合辑
1.扩散性百万甜面包 - 陈乙己 2.Unknown_Error - 说句闲话:研究珂学的最好方法是