简要题意:

给一个有向无环图,问每个节点删掉之后会导致多少个点不可达。

似乎以前拿来考过....

我们定义一棵树,它满足对应点造成的灭绝值即为当点的子树大小-1

  按照被捕食者--->捕食者的关系拓扑排序,然后依次建树,建到当前点的时候可以作为当前生物食物的点应当已经在树中了。如果当前点代表的生物要灭亡,很好理解那么可以作为它食物的生物都要灭亡,所以将这个点丢到它的可以作为它食物的生物的所有点的最近$LCA$点之下就可以了,可以用倍增$LCA$来维护动态加点。

  为了方便,可以令一个点作为所有生产者的根。

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstdlib>
#include<cmath>
#include<cstring>
using namespace std;
#define maxn 100100
#define llg int
#define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
llg n,m,e[maxn],du[maxn],dl[maxn],tpx[maxn],deep[maxn],f[maxn][],size[maxn];
vector<llg>a[maxn],c[maxn],g[maxn];
void in(llg x)
{
llg d;
while ()
{
scanf("%d",&d);
if (d==) break;
du[x]++;
a[d].push_back(x);
c[x].push_back(d);
}
} void TP()
{
dl[]=n+;
llg head=,tail=,x,v,w,cnt=;
do
{
x=dl[++head];
w=a[x].size();
tpx[x]=++cnt;
for (llg i=;i<w;i++)
{
v=a[x][i];
du[v]--;
if (du[v]==)
{
dl[++tail]=v;
}
}
}while (head!=tail);
} bool cmp(llg a,llg b){return tpx[a]<tpx[b];} void make_f(llg x) {for (llg i=;i<=;i++) f[x][i]=f[f[x][i-]][i-];} llg find(llg x,llg y)
{
if (deep[x]<deep[y]) swap(x,y);
for (llg i=;i>=;i--)
if (deep[f[x][i]]>=deep[y])
x=f[x][i];
if (x==y) return x;
for (llg i=;i>=;i--)
if (f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return f[x][];
} void work(llg x)
{
llg ro;
if (c[x].size()==) ro=c[x][];
else
{
llg w=c[x].size();
ro=find(c[x][],c[x][]);
for (llg i=;i<w;i++) ro=find(ro,c[x][i]);
}
f[x][]=ro; deep[x]=deep[ro]+;
g[ro].push_back(x);
make_f(x);
} void dfs(llg x)
{
llg w=g[x].size();
size[x]=;
for (llg i=;i<w;i++)
{
dfs(g[x][i]);
size[x]+=size[g[x][i]];
}
} int main()
{
yyj("catas");
cin>>n;
for (llg i=;i<=n;i++) in(i);
for (llg i=;i<=n;i++)
if (du[i]==)
{
du[i]++;
c[i].push_back(n+);
a[n+].push_back(i);
}
TP();
for (llg i=;i<=n+;i++) e[i]=i;
sort(e+,e+n+,cmp);
deep[n+]=;
for (llg i=;i<=n;i++)
work(e[i]);
dfs(n+);
for (llg i=;i<=n;i++) printf("%d\n",size[i]-);
return ;
}

【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]灾难

    题解: 构造灭绝树: x指向的点表示x的祖先死亡则x死亡 动态LCA: 可以用LCT维护或直接更新倍增数组 最后统计子树点的个数 坑: 我还不会序列型Toposort #include<iost ...

  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. [转载]基于 Token 的身份验证

    作者:王皓发布于:2015-08-07 22:06更新于:2015-08-07 22:07 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twit ...

  2. 基于spring框架的jt项目分页查询知识点(一)

    知识点汇总(一) 1. 点击事件函数 $(function(){ //事件注册,(表示在#pageId对应容器对象的相关子元素中注册click事件) $("#pageId").on ...

  3. kswapd0 进程CPU占用过高

    前几天遇到的一个问题,自己本地用VM配置的虚拟机,一般会top查看进程以及CPU占用的一些情况.又一次用laravel 打印对象,里面的内容比较多,浏览器当时就卡了. 然后看进程的情况.我以为会是ng ...

  4. PHP 图片缩放类

    <?php /** * 图片压缩类:通过缩放来压缩. * 如果要保持源图比例,把参数$percent保持为1即可. * 即使原比例压缩,也可大幅度缩小.数码相机4M图片.也可以缩为700KB左右 ...

  5. tls 双向认证 client端代码例子

    example: python import httplib import json import ssl import urllib2 import requests CA_FILE = " ...

  6. vertica导出导入数据

    直接开. 导出dat vsql -U dbadmin -wlizhenghua -At -F'|' -c "select * from APP_INTER_BOSS_CDR_COUNT_T& ...

  7. Matlab绘制三维曲面(以二维高斯函数为例)

    原文地址为:Matlab绘制三维曲面(以二维高斯函数为例) 寒假学习了一下Python下的NumPy和pymatlab,感觉不是很容易上手.来学校之后,决定继续看完数字图像处理一书.还是想按照上学期的 ...

  8. noip 2013 提高组 day1

    1.转圈游戏: 解析部分略,快速幂就可以过 Code: #include<iostream> #include<fstream> using namespace std; if ...

  9. 探究is与==的区别

    1.is  和 ==的区别: 主要参考内存地址: 部分字符串和数字有固定的小数据池: 比如: a="abc" a1="abc" print(id(a),id(a ...

  10. 3545: [ONTAK2010]Peaks 平衡树,最小生成树

    链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3545 离线询问,按照权值排个序 就是在克鲁斯卡尔时候维护个treap,到时候挨个查询一下就好 ...