题目大意:一个经典的游戏:抢椅子。有\(n\)个人以及\(2n\)把椅子。开始时每个人坐在一把椅子上,而且他们每个人都有一个下一步想坐的位置(可以与之前重合)。每一个下一次可以在自己现在做的椅子和想坐的椅子上选择一个坐下。任意两个人不得坐在同一张椅子上。求合法的方案数。

手动翻译真是累,图论题一言不合先建图,讲每个人现在坐的椅子和想要做的椅子连边(这样就有了自环

一眼想到二分图,我是ZZ

我们考虑这个图的结构,可以分成多个联通块考虑。对于每一个联通块,我们都进行讨论(设联通块大小为\(x\)):

  1. 树状,这个时候很简单,相当于\(x-1\)个人(因为只有\(x-1\)条边)抢\(x\)把椅子。因此每次只有一把椅子空出,方案数即为\(x\)
  2. 环状(包括环套树),此时一个环上的方案数只有两种,即要么都不动,要么一起动。然后当环上的点都确定了之后其它的情况就唯一确定了(请自行画图理解)
  3. 自环,这个要特别讨论,此时方案数很显然就是\(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的更多相关文章

  1. Codeforces 859E Desk Disorder 并查集找环,乘法原理

    题目链接:http://codeforces.com/contest/859/problem/E 题意:有N个人.2N个座位.现在告诉你这N个人它们现在的座位.以及它们想去的座位.每个人可以去它们想去 ...

  2. Codeforces 859E Desk Disorder:并查集【两个属性二选一】

    题目链接:http://codeforces.com/problemset/problem/859/E 题意: 有n个人,2n个座位. 给出这n个人初始的座位,和他们想坐的座位. 每个人要么坐在原来的 ...

  3. 【CF MEMSQL 3.0 E. Desk Disorder】

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  4. 【cf859E】Desk Disorder

    Portal --> cf859E Solution ​​ 我们可以将每一个人看成一条边,将位置看成点,然后一个人在新的方案中可以选择的位置就是这条边连接的两个点,然后我们就得到了一个图 ​ 注 ...

  5. [codeforces 859 E] Desk Disorder 解题报告 (并查集+思维)

    题目链接:http://codeforces.com/problemset/problem/859/E 题目大意: 有$n$个人,$2n$个座位. 给出这$n$个人初始的座位,和他们想坐的座位. 每个 ...

  6. 【MemSQL Start[c]UP 3.0 - Round 1 E】Desk Disorder

    [链接]h在这里写链接 [题意] 有N个人. 2N个座位. 现在告诉你这N个人它们现在的座位.以及它们想去的座位. 每个人可以去它们想去的座位或者就站在原地不动. 新的座位和旧的座位,都不允许一个座位 ...

  7. CF859E Desk Disorder

    传送门 Luogu Solution 好好思考一下,发现人和座位构成的是一个二分图这还用想? 那么这个时候发现其实我们要求的就是这个二分图完全匹配的方案数,考虑在二分图上的一个连通块,如果是树,那么就 ...

  8. 「CF859E」Desk Disorder

    传送门 Luogu 解题思路 一眼想到二分图:但是求不了最大匹配方案数 oho. 于是考虑这么建图: 直接将一个人可以去的两把椅子连边,然后原图中的2n个点就会形成许多联通块,这个可以分步计数. 又因 ...

  9. 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 ...

随机推荐

  1. Kotlin入门(20)几种常见的对话框

    提醒对话框手机上的App极大地方便了人们的生活,很多业务只需用户拇指一点即可轻松办理,然而这也带来了一定的风险,因为有时候用户并非真的想这么做,只是不小心点了一下而已,如果App不做任何提示的话,继续 ...

  2. servlet及jsp之间的请求转发

    1.servlet间的请求转发 <dependencies> <dependency> <groupId>javax.servlet</groupId> ...

  3. Selenium Webdriver 动态设置 Proxy

    Step 1: Visiting "about:config" driver.get("about:config"); Step 2 : Run script ...

  4. C++中cin.clear()的用法

    我们谈谈cin.clear的作用,第一次看到这东西,很多人以为就是清空cin里面的数据流,而实际上却与此相差很远,首先我们看看以下代码: #include <iostream>  usin ...

  5. Git永久删除文件和历史记录

    目录 Git永久删除文件和历史记录 使用filter-branch 添加到.gitignore文件里并push修改后的repo 清理和回收空间 Git永久删除文件和历史记录 造成你想从git存储库中永 ...

  6. win7 系统中的加密文件打不开了

    网友提问:我原来安装的时候win7 32位 旗舰版系统,因为想电脑达到最大运行速度,所以决定把系统重装为64位的win 7系统.[了解win 7 32位于64位的区别]因为重装前未解密bitlocke ...

  7. Lua 与C 交互之LUA_REGISTRYINDEX(3)

    通常来说,C函数需要保留一些非局部的数据,也就是指那些超过他们作用范围的数据.C语言中我们使用全局变量或者static变量来满足这种需要.然而当你为Lua设计一个程序库的时候,全局变量和static变 ...

  8. Lets encrypt安装及配置

    letsencrypt recommend that most people with shell access use the Certbot ACME client.It can automate ...

  9. python第四十九课——对象序列化与反序列化

    person.py class Person: def __init__(self,*args,**kwargs): print('我是Person类的构造...') # self.name=name ...

  10. solidity-library

    library 1)直接使用使用库合约的合约,可以将库合约视为隐式的父合约(base contracts),当然它们不会显式的出现在继承关系中.意思就是不用写is来继承,直接可以在合约中使用: lib ...