bzoj 2815 灾难
首先假设我们定义x灭绝后y会灭绝,那么离y最近的x就为y的父亲节点,那么如果我们可以求出每个节点的父亲节点,我们就得到了一棵树,然后每个节点的灾难值就是子树的大小-1。
我们将出度数为0的节点的父亲节点定义为0,那么我们可以发现,某个点的父亲节点就是他所有儿子的父亲节点的lca。
备注:lca写错了,查了半天。
//By BLADEVIL
#include <cstdio>
#include <cstring>
#include <algorithm>
#define maxn 100010
#define maxm 2000100 using namespace std; int n;
int pre[maxm][],last[maxn][],other[maxm][],cnt[maxn],l[];
int que[maxn],dep[maxn],size[maxn];
int jump[maxn][]; int lca(int x,int y) {
//if ((!x)||(!y)) return x+y;
//printf("fuck %d %d\n",x,y);
if (dep[x]>dep[y]) swap(x,y);
int det(dep[y]-dep[x]);
for (int j=;j<=;j++) if (det&(<<j)) y=jump[y][j];
//printf("%d\n",y);
if (x==y) return x;
for (int j=;j>=;j--) if (jump[x][j]!=jump[y][j]) x=jump[x][j],y=jump[y][j];
return jump[x][];
} void connect(int x,int y,int cur) {
if (((!y)||(!x))&&(cur!=)) return ;
pre[++l[cur]][cur]=last[x][cur];
last[x][cur]=l[cur];
other[l[cur]][cur]=y;
if (!cur) cnt[x]++;
//if (cur==2) printf("|%d %d\n",x,y);
} void dfs(int x) {
size[x]=;
for (int p=last[x][];p;p=pre[p][]) {
dfs(other[p][]);
size[x]+=size[other[p][]];
}
} int main() {
scanf("%d",&n);
for (int i=;i<=n;i++) {
int x();
while (x) scanf("%d",&x),connect(i,x,),connect(x,i,);
}
int h(),t();
//for (int i=1;i<=n;i++) printf("%d ",cnt[i]); printf("\n");
for (int i=;i<=n;i++) if (!cnt[i]) que[++t]=i;
while (h<t) {
int cur(que[++h]);
for (int p=last[cur][];p;p=pre[p][]) {
cnt[other[p][]]--;
if (!cnt[other[p][]]) {
que[++t]=other[p][];
}
}
}
//for (int i=1;i<=n;i++) printf("%d %d %d\n",i,que[i],dep[i]); printf("\n");
memset(dep,,sizeof dep);
dep[]=;
for (int i=;i<=n;i++) {
int cur(que[i]);
jump[cur][]=other[last[cur][]][];
for (int p=pre[last[cur][]][];p;p=pre[p][]) jump[cur][]=lca(jump[cur][],other[p][]);
//printf("|%d %d\n",cur,jump[cur][0]);
connect(jump[cur][],cur,); dep[cur]=dep[jump[cur][]]+;
for (int j=;j<=;j++) jump[cur][j]=jump[jump[cur][j-]][j-];
}
//printf("%d\n",lca(0,5));
//for (int i=1;i<=n;i++) printf("%d ",jump[i][0]); printf("\n");
dfs();
for (int i=;i<=n;i++) printf("%d\n",size[i]-);
return ;
}
bzoj 2815 灾难的更多相关文章
- 灾难 bzoj 2815
灾难(1s 128MB)catas [样例输入] 5 0 1 0 1 0 2 3 0 2 0 [样例输出] 4 1 0 0 0 题解: 主要算法:拓扑排序:最近公共祖先(Lca): 先跑出拓扑序 我们 ...
- 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 ...
- bzoj 2815 灭绝树
对于一个食物网(一个DAG),一个物种死亡后,某些物种就必然死亡,求出必然死亡的是那些物种. 灭绝树的另一种含义是:“灭绝树跟节点到节点u的路径上的节点由那些原图中从根节点到节点u的所有路径中都经过了 ...
- bzoj 2815
http://www.cnblogs.com/JS-Shining/archive/2013/01/12/2857429.html 题面 题解上写了用什么dominator tree,吓晕了,看了看, ...
- BZOJ2815: [ZJOI2012]灾难
传送门 学LCA的时候根本没意识到LCA可以有这么多玩法. 这玩意据说是个高级数据结构(支配树)的弱化版,蒟蒻没学过呀.所以出题人提出一个概念叫灾难树. 我理解的灾难树的意思实际上是属于DAG的一个子 ...
- Luogu 2597 [ZJOI2012]灾难
BZOJ 2815. 解法还是挺巧妙的. 放上写得很详细很好懂的题解链接 戳这里. 一个物种$x$如果要灭绝,那么沿着它的入边反向走走走,一定可以走到一个点$y$,如果这个点$y$的物种灭绝了,那么 ...
- 2815: [ZJOI2012]灾难 - BZOJ
题目描述 Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 ...
随机推荐
- ehcache 一二事 - ssm 中ehcashe的简单配置应用
Ehcache是一个开源Java分布式缓存.可以配合mybatis来使用 首先,在资源文件夹中新建ehcache.xml 内容如下: <?xml version="1.0&qu ...
- CSS选择器的权重与优先规则
权重顺序 “important > 内联 > ID > 类 > 标签 | 伪类 | 属性选择 > 伪对象 > 继承 > 通配符”. 原文:http://w ...
- R 分类进行数值处理
主要Mark一下R程序中,分类进行数值计算的情况. 1.aggregate函数 有数据框case,列名分别a,b,c,d,e,f (1)根据一列对另一列求和:根据a,对d求和 sum1 <- a ...
- bzoj roll题器(Py大法好)
此roll题器能实现非权限号跳过权限题及所有号跳过已切题 点击下载rar文件(py2) 点击下载rar文件(py3)
- C#操作JSON
http://www.cnblogs.com/LiZhiW/p/3624729.html C#操作JSON 1. .NET对JSON的支持介绍............................. ...
- 在matlab中进行遥感影像地理坐标的相互转换
在matlab中进行图像处理,一般使用的都是图像本地坐标,以左上角(1,1)开始.处理完成后,如果要将结果在带地理坐标的遥感影像中显示,或者需要输出成shp文件,就需要涉及到本地坐标和地理坐标的转换, ...
- Android 获取地理位置的经度和纬度(zz)
在Android应用程序中,可以使用LocationManager来获取移动设备所在的地理位置信息.看如下实例:新建android应用程序TestLocation. 1.activity_main.x ...
- [CareerCup] 8.7 Chat Server 聊天服务器
8.7 Explain how you would design a chat server. In particular, provide details about the various bac ...
- Arduino小车学习与研究博客
Arduino小车学习与研究博客 信安系统设计基础实践模块 Arduino小车学习与研究 ================== 陈都(20135328) 余佳源(20135321) 莫凡(201352 ...
- VC++中复制对话框资源 之较好方法之一
资源对话框的编写有时候较为麻烦,这里我成功实现了这个方法的可用性,具体如下: 碰到模块移植问题了,自己做的对话框类(继承于CDialog)要移植到目标工程中.在网上搜了几个帖子发现都说的很生涩. ...