bzoj3444: 最后的晚餐(并查集+组合数学)
3444: 最后的晚餐
题目:传送门
题解:
考虑有解的情况:
直接上并查集,同一个联通块里的人一定要坐在一起的。不难发现其实对于每个联通块最多就只有两种排列方式,那就直接把大于等于两个人的联通块先去做快速幂,然后直接看成cnt个数来全排列。
对付无解的情况:
1、不难想到,有环就无解。
2、深入想想,一个人最多和两个暗恋对象坐在一起,那么如果一个人暗恋三个人或被三个人暗恋...那也无解
3、最后一个有点坑,题目说没有自恋,但是没有说两情相悦不OK啊,那就要特判了ORZ
吐槽:CC问我奇环合不合法...笑眯眯嘿嘿嘿,应该支持同性恋???
代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define mod 989381
using namespace std;
typedef long long LL;
int n,m,x,y,fa[];
int findfa(int x){if(fa[x]!=x)fa[x]=findfa(fa[x]);return fa[x];}
LL p_m(LL a,int b)
{
LL ans=;
while(b)
{
if(b%==)ans=ans*a%mod;
a=a*a%mod;b/=;
}
return ans;
}
int d[],tot[];LL cnt;
int mp[];
int main()
{
memset(d,,sizeof(d));memset(mp,,sizeof(mp));
scanf("%d%d",&n,&m);bool bk=true;
for(int i=;i<=n;i++)fa[i]=i;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);if(mp[y]==x || mp[x]==y)continue;mp[x]=y;
if(d[x]>= || d[y]>=){bk=false;break;}
int fx=findfa(x),fy=findfa(y);
if(fx!=fy)fa[fy]=fx;else {bk=false;break;}
d[x]++;d[y]++;
}
cnt=;memset(tot,,sizeof(tot));LL k=;
if(bk==false){printf("0\n");return ;}
for(int i=;i<=n;i++)fa[i]=findfa(i);
for(int i=;i<=n;i++)
{
if(fa[i]==i)cnt++;
tot[fa[i]]++;
}
for(int i=;i<=n;i++)if(tot[i]==)k++;
LL ans=p_m(,cnt-k);for(LL i=;i<=cnt;i++)ans=ans*i%mod;
printf("%lld\n",ans);
return ;
}
bzoj3444: 最后的晚餐(并查集+组合数学)的更多相关文章
- 【bzoj3444】最后的晚餐 并查集
题目描述 n个人排成一排,有m个条件,第i个条件要求ai和bi相邻,求方案数. 输入 输入有m+1行,第一行有两个用空格隔开的正整数n.m,如题所示.接下来的m行,每一行有两个用空格隔开的正整数,第i ...
- 2019牛客暑期多校训练营(第九场) E-All men are brothers(并查集+组合数学)
>传送门< 题意:最初有 n个人且互不认识,接下来 m行,每行有 x,y表示x和y交朋友,朋友关系满足自反性和传递性,每次输出当前选取4个人且互不认识的方案数. 思路:比赛的时候知道是用并 ...
- BZOJ3444 最后的晚餐【细节题+组合数学】*
BZOJ3444 最后的晚餐 Description [问题背景] 高三的学长们就要离开学校,各奔东西了.某班n人在举行最后的离别晚餐时,饭店老板觉得十分纠结.因为有m名学生偷偷找他,要求和自己暗恋的 ...
- 2019牛客多校第⑨场E All men are brothers(并查集+组合数学)
原题:https://ac.nowcoder.com/acm/contest/889/E 思路: 做并查集,维护每个集合大小,初始化操作前的总方案数,每次合并两个集合时减少的数量=合并的两个集合大小相 ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- [UOJ#131][BZOJ4199][NOI2015]品酒大会 后缀数组 + 并查集
[UOJ#131][BZOJ4199][NOI2015]品酒大会 试题描述 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品酒家”和“首席猎手”两个 ...
- 4199. [NOI2015]品酒大会【后缀数组+并查集】
Description 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 酒家”和“首席猎手”两个奖项,吸引了众多品酒师参加.在大会的晚餐上,调酒师 ...
- P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...
- 第9场 E-All men are brothers(并查集)
题目链接 题意:n个人,m次操作,每次操作使得两个人(x,y)成为朋友,朋友的关系是可以传递的,计算执行每次操作后,选择四个人两两都不是朋友的不同方案的数目. 数据范围:(n <= 100000 ...
随机推荐
- android 给url添加cookie
前些天因为项目需要写了一个通过网络连接去服务端拿数据的方法,但是需要让程序添加上cookie,因为之前对cookie 没有怎么研究过(包括做web 那会也没有用过或者说很少用),所以 一时用起来不太会 ...
- hdoj--2579--Dating with girls(2)(搜索+三维标记)
Dating with girls(2) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- 通过QEMU-GuestAgent实现从外部注入写文件到KVM虚拟机内部
本文将以宿主上直接写文件到VM内部为例讲解为何要注入以及如何实现 tag: qemu-ga, qemu guest agent, kvm, guest-file-write, inject 小慢哥的原 ...
- GCD的小结
同步和异步的区别 同步:在当前线程中执行 异步:在另一条线程中执行 有4个术语比较容易混淆:同步.异步.并发.串行 同步和异步决定了要不要开启新的线程 同步:在当前线程中执行任务,不具备开启新线程的能 ...
- C# 特性(Attribute)
C# 特性(Attribute) 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明 ...
- c#中 abstract 和 virtual 的区别与用法
先来看abstract方法,顾名思义,abstract方法就是抽象方法. 1.抽象方法就是没有实现的,必须是形如: public abstract void Init(); 2.拥有抽象方法的类 ...
- canvas 画图优化
http://www.cnblogs.com/rhcad/archive/2012/11/17/2774794.html
- Mac 如何寻找Mac自带的IDLE
Mac 如何寻找Mac自带的IDLE 每次要打开IDLE时,需要如下动作:打开terminal --> 输入idle --> 回车,就自动打开IDLE了 图标如下: 选择在“Finder中 ...
- URL回车后发生了什么
1.解析URL ________________________________________________________________________ 关于URL: URL(Universa ...
- Block formatting context & Inline formatting context(BFC&IFC)的区别(转载)
何为BFC与IFC bfc与ifc是针对页面正常流的两种环境,块级元素处于bfc环境中,行内元素处于ifc环境中. 元素是块级元素or行内元素由其display属性决定: block, table, ...