P2597 [ZJOI2012]灾难——拓扑,倍增,LCA
最近想学支配树,但是基础还是要打好了的;
这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝;
求得就是一个点能支配几个点;
如果一个点没有食物了就会灭绝,那他的支配点就是他所有食物的LCA;
LCA死了,食物都死了,他也就死了;
我们先根据吃和被吃建图,连一条他和食物的有向边;
我们处理出拓扑序,入度为零的点就是终极捕食者;
重新建一个树,每个点支配的数量就是他为根的子树大小-1;
我们只需要将他和食物的LCA连边即可;这个时候我们连接的是反的,食物连向捕食者,这样子树大小才正确;
新加的虚拟节点没有影响,遍历树时很方便。
建立编号n+1的虚拟节点,将所有没有出边的光合食物连向这个点,以便以后求LCA;
注意每次都要更新f[][];
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=7e5+;
int pre[maxn*],last[maxn],other[maxn*],l;
int pre2[maxn*],last2[maxn],other2[maxn*],l2;
int n;
void add(int x,int y)
{
l++;
pre[l]=last[x];
last[x]=l;
other[l]=y;
} void add2(int x,int y)
{
l2++;
pre2[l2]=last2[x];
last2[x]=l2;
other2[l2]=y;
}
queue<int> q;
int topo[maxn],sum,in_eage[maxn];
int dep[maxn],father[maxn]; int f[maxn][]; void rmq(int x)
{
f[x][]=father[x];
for(int i=;i<=;i++)
{
f[x][i]=f[f[x][i-]][i-];
}
} int LCA(int x,int y)
{
if(dep[x]<dep[y]) swap(x,y);
for(int i=;i<=;i++)
{
if((dep[x]-dep[y])&(<<i)) x=f[x][i];
}
if(x==y) return x;
for(int j=;j>=;j--)
{
if(f[x][j]!=f[y][j])
{
x=f[x][j];
y=f[y][j];
}
}
return f[x][];
} void toposort()
{
for(int i=;i<=n;i++)
{
if(in_eage[i]==)
{
q.push(i);
}
}
while(!q.empty())
{
int x=q.front();
q.pop();
topo[++sum]=x;
for(int p=last[x];p;p=pre[p])
{
int v=other[p];
in_eage[v]--;
if(in_eage[v]==)
{
q.push(v);
}
}
}
} void build()
{
dep[n+]=;
father[n+]=n+;
for(int i=n;i>=;i--)
{
int x=topo[i];
if(last[x]==)
{
dep[x]=;
father[x]=n+;
add2(n+,x);
f[x][]=n+;
continue;
}
else
{
int lca=other[last[x]];
for(int p=last[x];p;p=pre[p])
{
int v=other[p];
lca=LCA(lca,v);
}
father[x]=lca;
add2(lca,x);
dep[x]=dep[lca]+;
rmq(x);
}
}
}
int siz[maxn]; void dfs(int x)
{
siz[x]=;
for(int p=last2[x];p;p=pre2[p])
{
int v=other2[p];
dfs(v);
siz[x]+=siz[v];
}
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
while(x)
{
in_eage[x]++;
add(i,x);
scanf("%d",&x);
}
}
toposort();
build();
dfs(n+);
for(int i=;i<=n;i++)
{
printf("%d\n",siz[i]-);
}
return ;
}
P2597 [ZJOI2012]灾难——拓扑,倍增,LCA的更多相关文章
- P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)
		传送门 据大佬说这玩意儿好像叫灾难树还是灭绝树? 我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边 以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是 ... 
- 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA
		[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ... 
- 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]
		题目传送门 灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. ... 
- BZOJ2815:[ZJOI2012]灾难(拓扑排序,LCA)
		Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过 ... 
- P2597 [ZJOI2012]灾难 拓扑排序
		这个题有点意思,正常写法肯定会T,然后需要优化.先用拓扑排序重构一遍树,然后进行一个非常神奇的操作:把每个点放在他的食物的lca上,然后计算的时候直接dfs全加上就行了.为什么呢,因为假如你的食物的l ... 
- 洛谷 P2597 [ZJOI2012]灾难 解题报告
		P2597 [ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发 ... 
- 【bzoj2815】[ZJOI2012]灾难  拓扑排序+倍增LCA
		题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ... 
- [洛谷P2597] [ZJOI2012]灾难
		洛谷题目链接:[ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引 ... 
- BZOJ 2815: [ZJOI2012]灾难 拓扑排序+倍增LCA
		这种问题的转化方式挺巧妙的. Code: #include <bits/stdc++.h> #define N 100000 #define M 1000000 #define setIO ... 
随机推荐
- 音视频入门-10-使用libyuv对YUV数据进行缩放、旋转、镜像、裁剪、混合
			* 音视频入门文章目录 * libyuv libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换.旋转.缩放等的库.它是跨平台的,可在 Windows.Linux.Mac.A ... 
- 日常hive遇到的问题
			1 hive中的复杂数据类型数据如何导入(array) 创建hive表 create table temp.dws_search_by_program_set_count_his( program_s ... 
- 哈夫曼树详解——PHP代码实现
			在介绍哈夫曼树之前需要先了解一些专业术语 路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L ... 
- 分享一个仿网易新闻客户端iPhone版的标签式导航ViewController
			该Controller是一个容器,用于容纳其他的controller.效果与网易新闻客户端的标签式导航基本一样: (1)点击上面的标签,可以切换到对应的controller,标签下面的红色提示条的长度 ... 
- SAP Marketing Cloud功能简述(一) : Contacts和Profiles
			Dong Grace是Jerry的同事,目前是SAP成都研究院数字创新空间团队的一名实习生,明年7月才毕业.这篇文章是Grace对SAP Marketing Cloud功能梳理的一篇学习笔记,因为篇幅 ... 
- java,单文件和多文件上传代码范例
			上传一个单文件,用request.getFile得到文件(下面的功能是上传到阿里云) @RequestMapping(value = {"/content"}, method = ... 
- 在使用pandas获取网上数据报出url错误的解决办法
			在使用pandas.read_csv('网址名')时,出现url错误是,需要在导包出添加一下两句代码 import ssl ssl._create_default_https_context = ss ... 
- 【公有云】在阿里云中申请免费ssl证书
			准备 拥有阿里云账号 拥有域名,最好是在同个账号下,方便操作. 申请证书 第一步:进入申请 第二步:选择证书类型 第三步:支付,就是走个流程,不用给钱 第四步:填写证书信息 第五步:验证域名 第六步: ... 
- NodeJS开发博客(一)
			1 区分 ECMAScript/JS/NodeJs --ECMAScript.定义了语法,写JS和NodeJS都要遵守: 变量定义,循环/判断/函数: 原型和原形链/作用域和闭包/异步 不能操作DOM ... 
- 301、404、200、304等HTTP状态
			在网站建设的实际应用中,容易出现很多小小的失误,就像mysql当初优化不到位,影响整体网站的浏览效果一样,其实,网站的常规http状态码的表现也是一样,Google无法验证网站几种解决办法,提及到由于 ... 
