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]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ...
随机推荐
- Day3-F-Buy Low Sell High-CodeForces867E
You can perfectly predict the price of a certain stock for the next N days. You would like to profit ...
- 「JSOI2007」建筑抢修
传送门 Luogu 解题思路 显然先把所有楼按照报废时间递增排序. 然后考虑 \(1\cdots i-1\) 都能修完, \(i\) 修不完的情况. 显然我们在这 \(i\) 个里面至多只能修 \(i ...
- 关于pandas增加行时,索引名称的一些问题
学习pandas两天了,关于这个增加行的问题一直困扰着我,测试了几个代码,终于搞通了一点(昨天是因为代码敲错了...) 直接上代码: dates = pd.date_range(',periods=6 ...
- 如何利用TableView显示自定义nib中创建的UITableViewCell或子类?
1.创建nib文件 cell.xib 2.在nib中拖一个UITableView出来,设置其reuse Identifier,再根据cell UI需要拖出view摆放好 3.创建ViewControl ...
- WOFF格式
WOFF格式WOFF文件格式是用WOFF (Web Open Font Format)创建的网页开放字体格式,Web开放字体格式(Web Open Font Format,简称WOFF)是一种网页所采 ...
- 学习进度-04 Scala的学习
在Scala中,主函数的定义是def main(args: Array[String]),Scala中必须使用对象方法 1.变量: Scala中的变量分为两种var和val. 例如:def main( ...
- 继OpenJDK 之后,OpenJFX也将迁移到 Git
导读 近日 OpenJFX 项目负责人 Kevin Rushforth 提交了一份将 OpenJFX 迁移到 GitHub 的提案. OpenJFX 是 JavaFX 的开源实现.JavaFX 是一个 ...
- 智能充电安全管理首选SOC单芯片方案:SI24R2F
SI24R2F简介: SI24R2F是一颗工作在2.45GHZ ISM 频段,专为低功耗有源RFID应用场合设计,集成崁入式2.45GHZ 无线射频发射器模块.64次可编程NVM存储器模块 ...
- VUE - 引入 npm 安装的模块 以及 uuid模块的使用
<template> <div> <form @submit.prevent="addTodo"> <in ...
- chromedriver版本问题
最新的chromedriver 66.0.3359.117 的对应chromedriver版本为2.38 http://npm.taobao.org/mirrors/chromedriver/ Web ...