【bzoj2815】灾难[ZJOI2012](拓扑排序+lca)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2815
原版题解:http://fanhq666.blog.163.com/blog/static/8194342620124274154996/
首先这个生态系统里可能有多个生产者,所以我们可以让生产者吃一种构造出来的食物——阳光。
这道题的图没有环(不然还怎么叫食物网),所以我们可以用拓扑排序把从阳光到各级消费者的先后顺序求出来。
我们可以建出一个结构(可以证明这个结构是一棵树),生物x会因为生物y的灭绝而灭绝,当且仅当y是x的祖先。
因此,如果一种生物会灭绝,只能是因为它的所有食物的lca灭绝了,否则至少有一种食物不会灭绝,这种生物也能活下去,所以这种生物在树上的位置就是它所有食物的lca的孩子。
然后我们把树建出来之后每个节点的答案就是以他为根的子树的节点个数-1。
代码:
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- #include<cstdlib>
- #include<ctime>
- #include<algorithm>
- #include<queue>
- #include<vector>
- #define ll long long
- ll read()
- {
- ll tmp=; char f=,c=getchar();
- while(c<''||''<c){if(c=='-')f=-; c=getchar();}
- while(''<=c&&c<=''){tmp=tmp*+c-''; c=getchar();}
- return tmp*f;
- }
- using namespace std;
- int fir[]={},ne[],to[],x[],y[];
- int q[],vis[]={};
- ll in[]={},cnt[];
- int fa[][],dep[];
- int n,m,tot=;
- void add(int x,int y){to[++tot]=y; ne[tot]=fir[x]; fir[x]=tot;}
- int lca(int x,int y)
- {
- int i;
- if(dep[x]<dep[y]){int tmp=x; x=y; y=tmp;}
- for(i=(int)(log(n)/log()+);i>=;i--)if(dep[x]-(<<i)>=dep[y])x=fa[x][i];
- if(x==y)return x;
- for(i=(int)(log(n)/log()+);i>=;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
- return fa[x][];
- }
- int main()
- {
- int i,j;
- n=read();
- for(i=;i<=n;i++){
- int k=read();
- if(!k)add(,i),in[i]=,x[tot]=i,y[tot]=;
- while(k){++in[i]; add(k,i); x[tot]=i; y[tot]=k; k=read();}
- }
- int h=,t=; q[]=; vis[]=;
- while(h<=t){
- for(i=fir[q[h]];i;i=ne[i]){
- --in[to[i]];
- if(!in[to[i]])q[++t]=to[i],in[to[i]]=<<;
- }
- ++h;
- }
- m=tot; tot=;
- for(i=;i<=n;i++)fir[i]=;
- for(i=;i<=m;i++)add(x[i],y[i]);
- for(i=;i<=n;i++)
- for(j=;<<j<=n;j++)
- fa[i][j]=-;
- fa[][]=-; dep[]=;
- for(i=;i<=n;i++){
- int p=-;
- for(j=fir[q[i]];j;j=ne[j])
- if(p==-)p=to[j];else p=lca(p,to[j]);
- fa[q[i]][]=p; dep[q[i]]=dep[p]+;
- for(j=;<<j<=n&&fa[fa[q[i]][j-]][j-]>=;j++)fa[q[i]][j]=fa[fa[q[i]][j-]][j-];
- }
- for(i=;i<=n;i++)cnt[i]=;
- for(i=n;i;i--)cnt[fa[q[i]][]]+=cnt[q[i]];
- for(i=;i<=n;i++)
- printf("%lld\n",cnt[i]-);
- }
bozj2815
【bzoj2815】灾难[ZJOI2012](拓扑排序+lca)的更多相关文章
- 【题解】 [ZJOI2012]灾难 (拓扑排序+LCA)
懒得复制,戳我戳我 Solution: 这题思路很神奇,首先你要知道这个毁灭树是怎么保证实现的:一句话就是如果该节点要被破坏,他的所有父节点就要被破坏,也就只要所有父节点的LCA被破坏就可以,所以我们 ...
- 【BZOJ2815】[ZJOI2012]灾难 拓扑排序+LCA
[BZOJ2815][ZJOI2012]灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从 ...
- BZOJ2815:[ZJOI2012]灾难(拓扑排序,LCA)
Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过 ...
- [BZOJ2815][ZJOI2012]灾难 灭绝树+拓扑排序+lca
灾难 [问题描述] 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那 么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的 生态灾难. 学过 ...
- BZOJ2815 拓扑排序 + LCA
https://www.lydsy.com/JudgeOnline/problem.php?id=2815 作为一个DAG图,结点之间又有这么明显的等级之分,很容易想到的是拓扑排序. 但是不管是正向的 ...
- 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA
题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ...
- 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]
题目传送门 灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. ...
- [BZOJ2815][ZJOI2012]灾难(拓扑排序/支配树)
支配树目前只见到这一个应用,那就不独分一类,直接作为拓扑排序题好了. 每个点向所有食物连边,定义fa[x]为x的支配点,即离x最近的点,满足若fa[x]灭绝,则x也要灭绝. 这样,将fa[x]向x连边 ...
- P2597 [ZJOI2012]灾难 拓扑排序
这个题有点意思,正常写法肯定会T,然后需要优化.先用拓扑排序重构一遍树,然后进行一个非常神奇的操作:把每个点放在他的食物的lca上,然后计算的时候直接dfs全加上就行了.为什么呢,因为假如你的食物的l ...
随机推荐
- 三维空间直线最近点对hdu4741
//求两条直线之间的关系(三维) //输入:两条不为点的直线 //输出:相交返回XIANGJIAO和交点p,平行返回PINGXING,共线返回GONGXIAN int LineAndLine(Line ...
- cocos2d-x设计模式发掘之一:单例模式
作者: firedragonpzy 原地址:http://www.firedragonpzy.com.cn/index.php/archives/1781 本系列文章我将和大家一起来发掘coc ...
- EasyGBS国标流媒体视频平台接入海康、大华、宇视的摄像机、硬盘录像机NVR、国标下级平台的方案
在上一篇<EasyNVR和EasyDSS云平台联手都不能解决的事情,只有国标GB28181能解决了>我们大致介绍了国标GB/T28181的使用场景,而且初步介绍了EasyGBS国标视频平台 ...
- Java死锁的理解
我们有时候操作数据库的时候会遇到死锁,那么什么使死锁呢?它的一个比较官方的定义就是:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将 ...
- commit Commit changes to stable storage 对变化提交
Python36\site-packages\pymysql\connections.py # Python implementation of the MySQL client-server pro ...
- 相似度模型 similarity model
Lucene4.0附加了相似度模型,允许在文档中使用不同的公式.
- yum命令的实例
1) 自定义yum仓库:createrepo 2) 自定义repo文件 3) 使用yum命令安装httpd软件包(在这里需要强调一点,本身执行yum.repos.d时,文件里面是有自带的yum源的,需 ...
- 理解是最好的记忆方法 之 CSS中a链接的4个伪类为何有顺序
在CSS中,a标签有4种伪类,分别为: a:link, a:visited, a:hover, a:active 对其稍有了解的前端er都知道,4个伪类是有固定顺序的(LVHA),否则很容易出现预期之 ...
- P2P-BT对端管理协议(附BT协议1.0)
对端管理 指的是远端peer集合的管理(尽管自身client也能够视为一个peer.但对端管理不包括自身peer) 一个client(client)必须维持与每一个远程peer连接的状态信息,即1V1 ...
- 0201-开始使用Spring Cloud实战微服务准备工作
1.Spring Cloud是什么 基于spring boot,之上快速构建分布式系统的工具集 服务注册和发现[eureka.Consul.Zookeeper].服务负载均衡[Ribbon,feign ...