最近想学支配树,但是基础还是要打好了的;

P2597 [ZJOI2012]灾难

这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝;

求得就是一个点能支配几个点;

如果一个点没有食物了就会灭绝,那他的支配点就是他所有食物的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的更多相关文章

  1. P2597 [ZJOI2012]灾难(倍增LCA+拓扑排序)

    传送门 据大佬说这玩意儿好像叫灾难树还是灭绝树? 我们先按建图,设点$u$的食物有$x[1]...x[k]$,即在图中这些点都有一条指向它的边 以样例来说,对于人,羊和牛都有一条指向它的边,然而不管是 ...

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

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

  3. 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]

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

  4. BZOJ2815:[ZJOI2012]灾难(拓扑排序,LCA)

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

  5. P2597 [ZJOI2012]灾难 拓扑排序

    这个题有点意思,正常写法肯定会T,然后需要优化.先用拓扑排序重构一遍树,然后进行一个非常神奇的操作:把每个点放在他的食物的lca上,然后计算的时候直接dfs全加上就行了.为什么呢,因为假如你的食物的l ...

  6. 洛谷 P2597 [ZJOI2012]灾难 解题报告

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

  7. 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA

    题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ...

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

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

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

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

随机推荐

  1. 第二次用map23333

    度熊所居住的 D 国,是一个完全尊重人权的国度.以至于这个国家的所有人命名自己的名字都非常奇怪.一个人的名字由若干个字符组成,同样的,这些字符的全排列的结果中的每一个字符串,也都是这个人的名字.例如, ...

  2. 如何使用Class和ClassLoader加载文件

    很多时候我们都需要在程序中加载各种文件,比如在加载配置文件,加载properties文件,或者只是加载一个文本文件,然后输出其中的内容,我在初学java的时候,就对加载文件非常头疼,今天又遇见了加载文 ...

  3. Suricata Rules

    Suricata Rules https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Suricata_Rules https ...

  4. 关键字:__thread & pthread_key_t

    在说__thread之前,先来看看pthread_ket_t吧. 参考:http://blog.csdn.net/lmh12506/article/details/8452700 上面的博文说的比较通 ...

  5. js实现图片的Blob base64 ArrayBuffer 的各种转换

    一.相关基础知识 构造函数 FileReader() 返回一个新构造的FileReader 事件处理 FileReader.onabort  处理abort事件.该事件在读取操作被中断时触发. Fil ...

  6. Oracle数据库账户口令复杂度-等保测评之身份鉴别

    1.     默认情况下数据库没有启用密码验证函数功能,可通过下面sql查询 SQL> select limit from dba_profiles where RESOURCE_NAME='P ...

  7. 关于#error

    很简单的一个东西,但是感觉使用价值没有太大.实现了以下,结果如下: 执行到#error语句的时候直接停止编译,在下面输出设定好的错误信息. 来自为知笔记(Wiz)

  8. python selectors模块实现 IO多路复用机制的上传下载

    import selectorsimport socketimport os,time BASE_DIR = os.path.dirname(os.path.abspath(__file__))''' ...

  9. thinkphp5自动生成文档/注释代码自动生成api文档

    composer require weiwei/api-doc dev-master 安装之后,readme 有详细的使用说明代码: 部分界面: gitbub:https://github.com/z ...

  10. CSS之属相相关

    一.padding与margin padding:就是内边距的意思,它是边框到内容之间的距离 另外padding的区域是有背景颜色的.并且背景颜色和内容的颜色一样.也就是说background-col ...