Description

P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态

Solution

根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点.

定义每个点 \(P\) 的支配点为从 \(S\) 到 \(P\) 的任意路径必经的点. 那么题意便为对于每一个点, 求有多少个点以它作为支配点.

考虑建立一棵支配树, 其中除了 \(S\) 之外的点 \(P\) 的父亲 \(\text{fa} (P)\) 表示距离 \(P\) 最近的支配点. 显然 \(\text{fa} (\text{fa} (P))\) 也为 \(P\) 的支配点.

我们先对图拓扑排序.

考虑所有能直接到达点 \(V\) 的点 \(U\), 即存在边 \((U,V)\). 那么 \(\text{fa} (V)\) 显然为所有 \(U\) 在支配树上的 \(\text{lca}\). 之后在支配树上加入边 \((\text{fa} (V), V)\) 即可. 对于 \(\text{lca}\), 可以通过倍增 \(O(\log n)\) 维护.

之后通过在支配树上DP即可求得结果. 同时, 发现支配树和DAG上的拓扑序相同, 可以利用刚才求到的拓扑序直接DP.

时间复杂度 \(O((n+m) \log n)\).

注意必须建立 \(S\)点, 否则如果多个没有入边的点时会死.==

Code

#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
using namespace std;
#define rep(i,l,r) for(register int i=(l);i<=(r);++i)
#define repdo(i,l,r) for(register int i=(l);i>=(r);--i)
#define il inline
typedef double db;
typedef long long ll; //---------------------------------------
const int nsz=65600,msz=1.5e6+50;
int n,ans[nsz];
struct te{int t,pr;}edge[msz];
int hd[nsz],pe=1,in[nsz];
void adde(int f,int t){
edge[++pe]=(te){t,hd[f]};
hd[f]=pe;
++in[t];
}
#define forg(p,i,v) for(int i=hd[p],v=edge[i].t;i;i=edge[i].pr,v=edge[i].t) int que[nsz],qh=1,qt=0;
int tp[nsz],pt=0;
void gettp(){
// rep(i,1,n)if(in[i]==0)que[++qt]=i;
que[++qt]=n+1;
int u;
while(qh<=qt){
u=que[qh++],tp[++pt]=u;
forg(u,i,v){
--in[v];
if(in[v]==0)que[++qt]=v;
}
}
} int fa[nsz][20],fa0[nsz],dep[nsz]{-1}; void addfa(int p,int f){
dep[p]=dep[f]+1;
fa[p][0]=f;
rep(i,1,18)fa[p][i]=fa[fa[p][i-1]][i-1];
}
int lca(int a,int b){
if(dep[a]<dep[b])swap(a,b);
repdo(i,18,0){
if(dep[fa[a][i]]<dep[b])continue;
a=fa[a][i];
}
if(a==b)return a;
repdo(i,18,0){
if(fa[a][i]==fa[b][i])continue;
a=fa[a][i],b=fa[b][i];
}
return fa[a][0];
} void sol(){
rep(i,1,n+1){
int p=tp[i];
if(fa0[p])addfa(p,fa0[p]);
forg(p,j,v){
if(fa0[v]==0)fa0[v]=p;
else fa0[v]=lca(fa0[v],p);
}
}
repdo(i,n+1,2){
int p=tp[i];
ans[fa[p][0]]+=ans[p]+1;
}
} int main(){
ios::sync_with_stdio(0),cin.tie(0);
cin>>n;
int a;
rep(i,1,n){
while(cin>>a,a){
adde(a,i);
}
if(in[i]==0)adde(n+1,i);
}
gettp();
sol();
rep(i,1,n)cout<<ans[i]<<'\n';
return 0;
}

luogu2597-[ZJOI2012]灾难 && DAG支配树的更多相关文章

  1. CF757F-Team Rocket Rises Again【最短路,DAG支配树】

    正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 \(n\)个点\(m\)条边的一张无向图,求删除\(s\)以外的一个点改变\(s\)到最多点的 ...

  2. 2019 Multi-University Training Contest 3 B 支配树

    题目传送门 题意:给出衣服有向无环图(DAG),,定义出度为0的点为中心城市,每次询问给出两个点,求破坏任意一个城市,使得这两个点至少有一个点无法到达中心城市,求方案数. 思路:首先建立反向图,将城市 ...

  3. [BZOJ2815][ZJOI2012]灾难(拓扑排序/支配树)

    支配树目前只见到这一个应用,那就不独分一类,直接作为拓扑排序题好了. 每个点向所有食物连边,定义fa[x]为x的支配点,即离x最近的点,满足若fa[x]灭绝,则x也要灭绝. 这样,将fa[x]向x连边 ...

  4. BZOJ2815: [ZJOI2012]灾难

    传送门 学LCA的时候根本没意识到LCA可以有这么多玩法. 这玩意据说是个高级数据结构(支配树)的弱化版,蒟蒻没学过呀.所以出题人提出一个概念叫灾难树. 我理解的灾难树的意思实际上是属于DAG的一个子 ...

  5. P2597 [ZJOI2012]灾难——拓扑,倍增,LCA

    最近想学支配树,但是基础还是要打好了的: P2597 [ZJOI2012]灾难 这道题是根据食物链链接出一个有向图的关系,求一个物种的灭绝会连带几种物种的灭绝: 求得就是一个点能支配几个点: 如果一个 ...

  6. cf757F Team Rocket Rises Again (dijkstra+支配树)

    我也想要皮卡丘 跑一遍dijkstra,可以建出一个最短路DAG(从S到任意点的路径都是最短路),然后可以在上面建支配树 并不会支配树,只能简单口胡一下在DAG上的做法 建出来的支配树中,某点的祖先集 ...

  7. 2018.06.27 NOIP模拟 节目(支配树+可持久化线段树)

    题目背景 SOURCE:NOIP2015-GDZSJNZX(难) 题目描述 学校一年一度的学生艺术节开始啦!在这次的艺术节上总共有 N 个节目,并且总共也有 N 个舞台供大家表演.其中第 i 个节目的 ...

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

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

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

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

随机推荐

  1. 开源前端脚本错误监控及跟踪解决项目BadJS试用

    摘要: 试用BadJS. 原文:开源前端脚本错误监控及跟踪解决项目-BadJS 试用 作者:过错 Fundebug经授权转载,版权归原作者所有. BadJS 是 一个web 前端脚本错误监控及跟踪项目 ...

  2. 第九课 表单及表单控件 html5学习4

    表单有由表单域.提示文本.表单3部分构成 一.表单控件 input 控件 1.<input />单标签2.input属性: 可以通过type属性变换形状 value默认值 name名称 c ...

  3. Echarts地图使用经验-地图变形和添加数据

    关于echart2,echart3地图的使用一点人生经验: 1.echart3,echart2加载地图变形修复. 最近在使用echart2使用过程中,发现加载海南地图会产生变形.如下图,海南地图产生了 ...

  4. 德国慕尼黑.NET俱乐部VS2019发布活动

    就在广州.NET俱乐部紧锣密鼓的准备配合VS2019发布搞一场大Party的时候,德国慕尼黑.NET俱乐部早就已经对外宣布他们将会配合VS2019发布搞两场活动,注意,是两场哦,不是一场哦. 第一场是 ...

  5. 虚拟机下centos7.x简易命令大全与试玩体验

    OS: liunxversion: centos7.xdate: 2019-01-18 1. cd  /                               : 进入服务器根目录2. cd . ...

  6. [20190409]pre_page_sga=true与连接缓慢的问题.txt

    [20190409]pre_page_sga=true与连接缓慢的问题.txt --//曾经遇到11g下设置pre_page_sga=true启动缓慢的问题(没有使用hugepages).--//链接 ...

  7. CSS盒子模型(Box Model)

    一.背景 作为CSS的重点,三大模块之一的盒子模型,这部分无论如何也要精通透彻.在任何一个网页当中,都有自己的布局方式,所谓网页布局方式就是如何把网页里面的文字.图片,很好的排版成美工设计的样式,这时 ...

  8. Chinese word segment based on character representation learning 论文笔记

    论文名和编号 摘要/引言 相关背景和工作 论文方法/模型 实验(数据集)及 分析(一些具体数据) 未来工作/不足 是否有源码 问题 原因 解决思路 优势 基于表示学习的中文分词 编号:1001-908 ...

  9. android菜鸟,了解android工程目录结构

  10. Django REST framework基础:版本控制

    DRF的版本控制 为什么需要版本控制 API 版本控制允许我们在不同的客户端之间更改行为(同一个接口的不同版本会返回不同的数据). DRF提供了许多不同的版本控制方案. 可能会有一些客户端因为某些原因 ...