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

每个人向自己可以代替的人连边,额外增加一个源点$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. leetCode 83.Remove Duplicates from Sorted List(删除排序链表的反复) 解题思路和方法

    Given a sorted linked list, delete all duplicates such that each element appear only once. For examp ...

  2. jQuery 标签切换----之选项卡的实现

    这一次,我自己写了代码,先看html部分: <div class="tab"> <div class="tab_menu"> <u ...

  3. OpenCV 中的三大数据类型:CvMat 类型

    前言 本文将介绍 OpenCV 中的矩阵结构 CvMat 并提供几个很常用的矩阵使用方法. 更多的矩阵处理函数还请参阅相关资料. CvMat 的类型定义 typedef struct CvMat { ...

  4. 【ASP.NET】巧用Cookie实战

    上篇介绍了究竟什么是Cookie.究竟是干什么用的,这篇博客具体具体的说一下.Cookie究竟怎样用. 首先建立如图所看到的的界面.通过该界面可登录到某个站点.详细要求例如以下: ·在首次登录后,将登 ...

  5. Windows App开发之经常使用控件与应用栏

    控件的属性.事件与样式资源 怎样加入控件 加入控件的方式有多种,大家更喜欢以下哪一种呢? 1)使用诸如Blend for Visual Studio或Microsoft Visual Studio X ...

  6. iOS界面-仿网易新闻左侧抽屉式交互 续(添加新闻内容页和评论页手势)

     本文转载至  http://blog.csdn.net/totogo2010/article/details/8637430       1.介绍 有的博友看了上篇博文iOS界面-仿网易新闻左侧抽屉 ...

  7. win10 64位 安装TensorFlow

    .由于之前安装的是python2.7 ,tensorflow在windows下必须要python3 网上查了一下有三种方法2版本共存 1.不用Anaconda windows 安装python2 与p ...

  8. 【BZOJ3992】[SDOI2015]序列统计 NTT+多项式快速幂

    [BZOJ3992][SDOI2015]序列统计 Description 小C有一个集合S,里面的元素都是小于M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数列中的每个数都属 ...

  9. jquery Jsonp的使用

    <script type="text/javascript"> $(function(){ $.ajax({ url:"test", jsonpCa ...

  10. 马尔科夫链在第n步转移的状态的概率分布