CF 859E Desk Disorder
题目大意:一个经典的游戏:抢椅子。有\(n\)个人以及\(2n\)把椅子。开始时每个人坐在一把椅子上,而且他们每个人都有一个下一步想坐的位置(可以与之前重合)。每一个下一次可以在自己现在做的椅子和想坐的椅子上选择一个坐下。任意两个人不得坐在同一张椅子上。求合法的方案数。
手动翻译真是累,图论题一言不合先建图,讲每个人现在坐的椅子和想要做的椅子连边(这样就有了自环)
一眼想到二分图,我是ZZ
我们考虑这个图的结构,可以分成多个联通块考虑。对于每一个联通块,我们都进行讨论(设联通块大小为\(x\)):
- 树状,这个时候很简单,相当于\(x-1\)个人(因为只有\(x-1\)条边)抢\(x\)把椅子。因此每次只有一把椅子空出,方案数即为\(x\)
- 环状(包括环套树),此时一个环上的方案数只有两种,即要么都不动,要么一起动。然后当环上的点都确定了之后其它的情况就唯一确定了(请自行画图理解)
- 自环,这个要特别讨论,此时方案数很显然就是\(1\)
然后我们根据乘法原理直接乘起来就好了。
不过主要这里我们只需要判断一个联通块是否成环以及计算环的大小即可
这个在并查集的时候顺带维护一下个数即可。连图都不用建
CODE
#include<cstdio>
#include<cctype>
using namespace std;
const int N=100005,mod=1e9+7;
int father[N<<1],size[N<<1],n,x,y,ans=1;
bool cir[N<<1],loop[N<<1];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline int getfather(int k)
{
return father[k]^k?father[k]=getfather(father[k]):k;
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n);
for (i=1;i<=n<<1;++i)
father[i]=i,size[i]=1;
for (i=1;i<=n;++i)
{
read(x); read(y);
if (x==y) loop[x]=1;
int fx=getfather(x),fy=getfather(y);
if (fx!=fy)
{
father[fx]=fy; loop[fy]|=loop[fx];
size[fy]+=size[fx]; size[fx]=0;
} else cir[fx]=1;
}
for (i=1;i<=n<<1;++i)
if (getfather(i)==i&&!loop[i])
{
if (cir[i]) ans=ans*2%mod; else ans=1LL*ans*size[i]%mod;
}
return printf("%d",ans),0;
}
CF 859E Desk Disorder的更多相关文章
- Codeforces 859E Desk Disorder 并查集找环,乘法原理
题目链接:http://codeforces.com/contest/859/problem/E 题意:有N个人.2N个座位.现在告诉你这N个人它们现在的座位.以及它们想去的座位.每个人可以去它们想去 ...
- Codeforces 859E Desk Disorder:并查集【两个属性二选一】
题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...
- 【CF MEMSQL 3.0 E. Desk Disorder】
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- 【cf859E】Desk Disorder
Portal --> cf859E Solution 我们可以将每一个人看成一条边,将位置看成点,然后一个人在新的方案中可以选择的位置就是这条边连接的两个点,然后我们就得到了一个图 注 ...
- [codeforces 859 E] Desk Disorder 解题报告 (并查集+思维)
题目链接:http://codeforces.com/problemset/problem/859/E 题目大意: 有$n$个人,$2n$个座位. 给出这$n$个人初始的座位,和他们想坐的座位. 每个 ...
- 【MemSQL Start[c]UP 3.0 - Round 1 E】Desk Disorder
[链接]h在这里写链接 [题意] 有N个人. 2N个座位. 现在告诉你这N个人它们现在的座位.以及它们想去的座位. 每个人可以去它们想去的座位或者就站在原地不动. 新的座位和旧的座位,都不允许一个座位 ...
- CF859E Desk Disorder
传送门 Luogu Solution 好好思考一下,发现人和座位构成的是一个二分图这还用想? 那么这个时候发现其实我们要求的就是这个二分图完全匹配的方案数,考虑在二分图上的一个连通块,如果是树,那么就 ...
- 「CF859E」Desk Disorder
传送门 Luogu 解题思路 一眼想到二分图:但是求不了最大匹配方案数 oho. 于是考虑这么建图: 直接将一个人可以去的两把椅子连边,然后原图中的2n个点就会形成许多联通块,这个可以分步计数. 又因 ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
随机推荐
- RabbitMQ延迟消息学习
准备做一个禁言自动解除的功能,立马想到了订单的超时自动解除,刚好最近在看RabbitMQ的实现,于是想用它实现,查询了相关文档发现确实可以实现,动手编写了这篇短文. 准备工作 1.Erlang安装请参 ...
- solr搜索引擎配置使用mongodb作为数据源
环境说明: 操作系统:由于是使用的docker直接拉取的镜像部署的,系统是LINUX环境 mongodb: 4.0.3 solr: 7.5.0 python: 3.5 配置mongodb 1.拉取mo ...
- 【HANA系列】SAP HANA XS使用Odata标志全解析
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Oda ...
- 解决wordpress上传文件出现http错误问题
解决wordpress上传文件出现http错误问题 问题现象 今天上传约1.4m大小的gif文件到wordpress的媒体库时失败,提示http错误. 原因 由于之前一直上传图片都是可以的,所以推测最 ...
- nginx、tomcat调优方向及压测网站步骤
nginx调优方向: 1.所用事件处理模型 2.进程数 3.每个进程的连接数 4.压缩 5.缓存 tomcat调优方向: 1.内存 2.总内存 3.初始申请内存 4.线程内存 5.GC方面 tomca ...
- Deuteronomy
You should choose the right path when you can choose, and you should choose the right path even if y ...
- BZOJ3295:[CQOI2011]动态逆序对(CDQ分治)
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- oracle11gR2 手工创建基于asm存储的oracle实例
http://www.cnblogs.com/beanbee/archive/2012/09/22/2697689.html使用命令行手工建立Oracle11gR2数据库 通过命令行建立一个数据库可以 ...
- A - I Think I Need a Houseboat HDU - 1065(水题)
题意:给你一个半圆,半圆以面积每年增加50平方英里的速度扩张.问(x, y)在多少年后被覆盖. 思路:emmm,其实最开始,还是打表的,因为每一年的半圆的半径可以算出来.啊啊啊啊,其实这个方法是可以的 ...
- Thinkphp5.0整合个推例子
最近做一个后台发送消息推送到app(android和ios)的功能,该功能采用的是个推接口,基于php的,我用TP5来实现这个推送流程.先看官方demo吧.可以先参考官方给到的例子来看http://d ...