传送门

题解:
新建SS<script type="math/tex" id="MathJax-Element-22">S</script>点连向所有普通护士。
注意到两个特殊护士能放假的等价条件是支配树上的lca为S,一个普通护士和一个特殊护士不能放假的条件是后者在支配树上位于前者子树中,建出支配树即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;const int RLEN=1<<18|1;
inline char nc() {static char ibuf[RLEN],*ib,*ob;(ib==ob) && (ob=(ib=ibuf)+fread(ibuf,1,RLEN,stdin));return (ib==ob) ? -1 : *ib++;
}
inline int rd() {char ch=nc(); int i=0,f=1;while(!isdigit(ch)) {if(ch=='-')f=-1; ch=nc();}while(isdigit(ch)) {i=(i<<1)+(i<<3)+ch-'0'; ch=nc();}return i*f;
}
inline void W(LL x) {static int buf[50];if(!x) {putchar('0'); return;}if(x<0) {putchar('-'); x=-x;}while(x) {buf[++buf[0]]=x%10; x/=10;}while(buf[0]) {putchar(buf[buf[0]--]+'0');}
}const int N=1e5+50;
int n,k,S,ind;
int fa[N],anc[N],mnsd[N],sze[N];
int dfn[N],id[N],sdom[N],idom[N];
vector <int> pre[N];
vector <int> buc[N];
vector <int> edge[N];inline void add(int x,int y) {edge[x].push_back(y);pre[y].push_back(x);
}
inline void dfs(int x,int f) {anc[x]=x; dfn[x]=++ind; id[ind]=x; sdom[x]=mnsd[x]=x; fa[x]=f;for(auto v:edge[x]) if(!dfn[v]) dfs(v,x);
}
inline void ga(int x) {if(anc[x]==x) return;ga(anc[x]);mnsd[x]=(dfn[sdom[mnsd[x]]]<dfn[sdom[mnsd[anc[x]]]]) ? mnsd[x] : mnsd[anc[x]];anc[x]=anc[anc[x]];
}
inline int eval(int x) {return ga(x),mnsd[x];}
inline void find_idom() {dfs(S,0);for(int i=ind;i>=2;i--) {int u=id[i];for(auto v:pre[u]) {if(!dfn[v]) continue;int t=eval(v);if(dfn[sdom[t]]<dfn[sdom[u]]) sdom[u]=sdom[t];}int f=fa[u]; anc[u]=f;buc[sdom[u]].push_back(u);for(auto v:buc[f]) {int t=eval(v);if(dfn[sdom[t]]<dfn[sdom[v]]) idom[v]=t;else idom[v]=sdom[v];}buc[f].clear();}for(int i=2;i<=ind;i++) {int u=id[i];if(idom[u]!=sdom[u]) idom[u]=idom[idom[u]];}
}
int main() {n=rd(), k=rd(), S=n+1;for(int i=1;i<=k;i++) sze[i]=1;for(int i=k+1;i<=n;i++) add(S,i);for(int i=1;i<=k;i++) for(int j=rd();j;j--) add(rd(),i);find_idom(); int j=0;for(int i=1;i<=k;i++)  j+=(!dfn[i]);W(j); putchar('\n');for(int i=1;i<=k;i++) if(!dfn[i]) W(i), putchar(' '); if(j) putchar('\n');for(int i=ind;i>=2;i--) sze[idom[id[i]]]+=sze[id[i]];LL ans=0, sum=0;for(int i=ind;i>=2;i--) {int u=id[i]; if(idom[u]!=S) continue;ans+=sum*sze[u]; sum+=sze[u];}ans=(LL)(k-j)*(k-j-1)/2-ans;for(int i=2;i<=ind;i++) {int u=id[i]; if(u>k) ans+=sze[u];}W(ans);
}

BJ模拟:医院(支配树)相关推荐

  1. hihocoder #1343 : Stable Members(支配树)

    时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Recently Little Hi joined an algorithm learning group. The gr ...

  2. 【学习笔记】DAG / 一般有向图的支配树 / 灭绝树

    定义与声明 一个有向图 GGG.给定一个起点 sss,假设 sss 能到达所有点. 若去掉某个点 iii 后,sss 无法到达 jjj,则称 iii 为 jjj 的支配点. 显然支配点存在传递关系. ...

  3. P5180-[模板]支配树

    正题 题目链接:https://www.luogu.com.cn/problem/P5180 题目大意 给出nnn个点的一张有向图,求每个点支配的点数量. 1≤n≤2×105,1≤m≤3×1051\l ...

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

    正题 题目链接:https://www.luogu.com.cn/problem/CF757F 题目大意 nnn个点mmm条边的一张无向图,求删除sss以外的一个点改变sss到最多点的最短路. 解题思 ...

  5. P2597-[ZJOI2012]灾难【DAG支配树】

    正题 题目链接:https://www.luogu.com.cn/problem/P2597 题目大意 nnn个点的一张DAGDAGDAG,对于每个点xxx求有多少点yyy满足从yyy出发到达某个出度 ...

  6. 支配树(洛谷-P5180)

    题目描述 给定一张有向图,求从1号点出发,每个点能支配的点的个数(包括自己) 输入输出格式 输入格式: 第一行两个正整数n,mn,m,表示点数和边数 接下来mm行,每行输入两个整数u,vu,v,表示有 ...

  7. HDU 4694: Important Sisters(支配树)

    题意: 御坂和她的n-1个克隆姐姐(编号1~n-1)构成一张御坂网络,如果第x号"姐姐"和第y号"姐姐"有条x到y的有向边,则说明x可以将信息传给y,已知御坂妹 ...

  8. Lengauer-Tarjan算法--支配树构造(bzoj 2815: [ZJOI2012]灾难)

    模型: 一个有向图G,设定一个点r,要求点r能到达G中所有的点,如果这样的点不存在,新建并向所有入度为0的点连边 支配点: 对于点u,如果在删掉点p之后,r不能到达u,那么称p(p!=u)点是u点的一 ...

  9. 【学习小记】支配树【图论】

    Preface 给定一个有向图和一个起点 s t st st,我们需要知道起点到某个点的关于必经点的信息. 若起点到点v的所有路径均经过点u,则我们称点u支配点v,显然一个点支配自己本身 顾名思义,支 ...

最新文章

  1. Linux中常见命令和单词的缩写全称
  2. ABAP中的F4帮助怎么用?
  3. 会使用基本的Render函数后,就会想,这怎么用 v-for/v-if/v-model;我写个vue Render函数进阶...
  4. table 设置边框
  5. teamviwer安装提示 Verification of your Teamviewer version failed!.
  6. Java案例:利用JDBC连接Oracle数据库
  7. 扁平化设计的几个规律
  8. 【Hive】Hive的数据类型
  9. javascript及css实现居中效果
  10. CMake使用总结,不断更新
  11. python 直方图均衡化_直方图均衡化-Python实现
  12. oracle10安装完成之后测试,RHEL4U4和RHEL5安装oracle10g(测试过绝对可以成功)
  13. Matlab 中min(),min(min()),max(),max(max())的介绍和分析
  14. 9:JDBC-Java API 实战
  15. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
  16. 基于MatlabSimulin的微电网模型及光伏电池建模仿真分析
  17. org.hibernate.QueryParameterException: could not locate named
  18. MQTT网关连接华为云物联网平台应用
  19. 2019年暑期GooGle SWE 凉经
  20. 手机UC浏览器字体放大

热门文章

  1. 免费的PDF在线合并工具,拿走不谢!
  2. 如何直观理解交叉熵及其优势?
  3. 博科光纤交换机常用命令
  4. centos重启和关闭命令
  5. 什么是三目运算符?对三目运算符的理解
  6. LinuxRaid的基本知识点
  7. 掩膜(mask)的学习总结
  8. 毕业论文文献引用方法
  9. Unity学习 — 23种设计模式
  10. 【OpenCV图像处理】二、图像的二值化操作