感觉有一点题面没有说得特别明确,就是一个人代替了其他人之后,另一个可以被他代替的人就不能让他来代替自己了。

每个人向自己可以代替的人连边,额外增加一个源点$r$向所有助教连边。第一问答案是$r$不能到达的点的个数。对于第二问,求出支配树,每个以$r$为父亲的点的子树中任选两个点都满足条件。

#include<cstdio>
struct edge{
int v;
edge*s;
};
template<int N,int M>
struct graph{
edge*l,e[M],*h[N];
graph():l(e){}
void ins(int u,int v){
*l={v,h[u]};
h[u]=l++;
}
};
const int N=5005;
const int M=25005;
graph<N,M>t1,t2;
graph<N,N>buc;
int n,f[N],par[N],semi[N],ver[N],dom[N],anc[N],lab[N];
void dfs(int u){
semi[u]=++n;
ver[n]=u;
for(edge*i=t1.h[u];i;i=i->s)
if(!semi[i->v]){
par[i->v]=u;
dfs(i->v);
}
}
inline int eval(int u){
if(anc[anc[u]]){
eval(anc[u]);
if(semi[lab[anc[u]]]<semi[lab[u]])
lab[u]=lab[anc[u]];
anc[u]=anc[anc[u]];
}
return lab[u];
}
void sol(int r){
dfs(r);
for(int i=1;i<=n;++i)
lab[ver[i]]=ver[i];
for(int i=n;i>=2;--i){
int u=ver[i];
for(edge*i=t2.h[u];i;i=i->s)
if(semi[i->v]){
int w=eval(i->v);
if(semi[w]<semi[u])
semi[u]=semi[w];
}
buc.ins(ver[semi[u]],u);
anc[u]=par[u];
for(edge*i=buc.h[par[u]];i;i=i->s){
int w=eval(i->v);
dom[i->v]=semi[w]<semi[i->v]?w:par[u];
}
buc.h[par[u]]=0;
}
for(int i=2;i<=n;++i){
int u=ver[i];
if(dom[u]!=ver[semi[u]])
dom[u]=dom[dom[u]];
}
}
void ins(int u,int v){
t1.ins(u,v);
t2.ins(v,u);
}
int main(){
struct{
operator int(){
int x=0,c=getchar();
while(c<48)
c=getchar();
while(c>47)
x=x*10+c-48,c=getchar();
return x;
}
}buf;
int r=buf+1,l=buf;
for(int u=1;u<=l;++u){
int a=buf;
while(a--)
ins(buf,u);
}
for(int u=l+1;u<r;++u)
ins(r,u);
sol(r);
int s=0;
for(int i=n;i>=2;--i){
int&a=f[ver[i]];
int v=dom[ver[i]];
f[v]+=++a;
if(v==r)
s+=a*(a-1)/2;
}
printf("%d %d\n",r-n,s);
}

BZOJ4307: Maishroom & Class的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Linux系统运维之路

    九月份开始,半年内搞定运维,博客会慢慢的更新,vim编辑器,Nginx配置文件优化 运维基础 运维基础-Linux发展史.安装.基本操作 运维基础-用户和组管理 运维基础-文件权限管理 运维基础-进程 ...

  2. hdu1081 最大子矩阵

    最大子矩阵自然直在最大连续子序列的升级版  只是其原理都是用到了动态规划思想     仅仅是矩阵用到了枚举 +合并       把非常多列看成是一列的和 #include<stdio.h> ...

  3. uboot之bootm以及go命令的实现

    本文档简单介绍了uboot中用于引导内核的命令bootm的实现,同时分析了uImage文件的格式,还简单看了一下uboot下go命令的实现 作者: 彭东林 邮箱: pengdonglin137@163 ...

  4. centOS中如何修改运行级别!

    在图形化界面可以用Ctrl+Alt+F2进入命令行窗口 * 假如你使用了虚拟机,有可能会出现不能进去的问题,原因是因为热键冲突 * 解决办法:修改热键就行了 edit→parameter→hot ke ...

  5. cakephp 基本的环境

    这里是在 window下的环境搭建,我假设php,apache,mysql,的基本环境都ok,如果没有的话,偷个懒,用集成环境吧,我用的wampserver.1:去官网(http://cakephp. ...

  6. detached HEAD state

    1 detached HEAD state指的是什么 正常情况下,HEAD指向一个branch,而branch又指向一个commit. detached HEAD state指的是HEAD指针没有指向 ...

  7. 性能测试--Jmeter随机生成/随机选取/csv读取关键字

    Jmeter随机生成/随机选取/csv读取关键字 一.随机生成关键字 随机生成关键字,需要组件:随机变量配置元件(Random Variable)  该组件的作用是生成字符+随机数字格式的字符串,并保 ...

  8. 【题解】[P4178 Tree]

    [题解]P4178 Tree 一道点分治模板好题 不知道是不是我见到的题目太少了,为什么这种题目都是暴力开值域的桶QAQ?? 问点对,考虑点分治吧.直接用值域树状数组开下来,统计的时候直接往树状数组里 ...

  9. 通过主机名来获取一个ip对象

    //通过名称(ip字符串or主机名)来获取一个ip对象. InetAddress ip = InetAddress.getByName("www.baidu.com");//jav ...

  10. winserver 资源下载

    http://msdn.itellyou.cn/  下载各种系统资源,支持迅雷下载,速度杠杠的