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

每个人向自己可以代替的人连边,额外增加一个源点$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. Allegro skill

    https://blog.csdn.net/wyu0725/article/details/52367199 Allegro skill二次开发和更改菜单页面 简单的使用skill;能够使Aleggr ...

  2. 数据挖掘之Slope One

    计算偏差: card() 表示集合包含的元素数量. http://www.cnblogs.com/similarface/p/5385176.html 论文地址:http://lemire.me/fr ...

  3. servletResponse 文件下载

    package response; import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOEx ...

  4. linux的MACHINE_START-MACHINE_END(转)

    转自: http://blog.sina.com.cn/s/blog_753fd0b00100t8js.html 在友善mini2440提供的linux2.6.32.2内核中,有如下定义: MACHI ...

  5. 世界更清晰,搜狐新闻客户端集成HUAWEI HiAI 亮相荣耀Play发布会!

    ​​6月6日,搭载有“很吓人”技术的荣耀Play正式发布,来自各个领域的大咖纷纷为新机搭载的惊艳技术站台打call,其中,搜狐公司董事局主席兼首席执行官张朝阳揭秘:华为和搜狐新闻客户端在硬件AI方面做 ...

  6. Appium python Uiautomator2 多进程问题

    appium更新uiautomator后可以获取tost了,大家都尝试,课程中也讲解了,但是这些跑的时候都在单机上,当我们多机并发的时候会出现一个端口问题,因为我们appium最后会调用uiautom ...

  7. go with go

    1, vim 安装vim-go 打造GOLANG 专用IDE golang和vim-go安装配置 2, 阅读图书 <Go语言实战> William Kennedy等, 李兆海 译 3,在线 ...

  8. OpenCV 入门示例之四:一个简单的变换

    前言 图像的平滑处理,是计算机视觉中非常重要的操作,本文将展示一个可以对图像进行平滑处理的简单程序.而关于平滑处理深层次的知识,会在以后的文章中重点探讨. 代码示例 // 此头文件包含图像IO函数的声 ...

  9. 【React Native开发】React Native控件之RefreshControl组件具体解释(21)

    ),React Native技术交流4群(458982758)种 enabled  bool   android平台适用   用来设置下拉刷新功能是否可用 progressBackgroundColo ...

  10. 几句话搞懂URI、URL、URN之间的关系

    1.URI,是uniform resource identifier,统一资源标识符,用来唯一的标识一个资源. 2.RL是uniform resource locator,统一资源定位器,它是一种具体 ...