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 ...
随机推荐
- 安卓开发ScrollView嵌套ListView只显示一行
在用列表控件做一个“更多功能”的界面的时候 <?xml version="1.0" encoding="utf-8"?> <ScrollVie ...
- JavaScript按日期排序之灵活排序
上代码: var dataContent = [ { ID: "1", hobbit: "去音乐", sport: "在篮球", movie ...
- 【JS单元测试】Qunit 和 jsCoverage使用方法
近日在网上浏览过很多有关js单元测试相关的文档,工具,但是,针对Qunit 和 jsCoverage使用方法,缺少详细说明,对于初入前端的人来说,很难明白其中的意思,特此整理这篇文章,希望 ...
- Python零基础学习系列之三--Python编辑器选择
上一篇文章记录了怎么安装Python环境,同时也成功的在电脑上安装好了Python环境,可以正式开始自己的编程之旅了.但是现在又有头疼的事情,该用什么来写Python程序呢,该用什么来执行Python ...
- NFS常见问题
问题一:取消挂载失败 问题现象: umount /opt/data umount.nfs: /opt/data: device is busy umount.nfs: /opt/data: devic ...
- 【记录】GIT 常用命令记录
1. 查看所有的提交版本,包含当你co到之前提交版本后依旧可以看到以前的日志 git log --graph --pretty=format:'%h -%d %s (%cr)' --abbrev-co ...
- 用navicat手动删除了数据表的记录,再次写入的时候,怎么让id重新从1开始?
问:用navicat手动删除了mariadb数据表的记录,再次写入的时候,自增id会继续,不会从1开始. 比如,原来有10条记录,全部清空,再次写入数据,id会从11开始,怎么让他重新从1开始呢? 重 ...
- vue框架简介
MVVM框架概述 什么是vue 是一套构建用户界面的渐进式(用到哪一块就用哪一块,不需要全部用上)前端框架,Vue 的核心库只关注视图层 vue的兼容性 Vue.js 不支持 IE8 及其以下版本,因 ...
- HTTP 请求方法
一.HTTP中定义了以下几种请求方法: 1.GET:2.POST:3.PUT:4.DELETE; 5.HEAD:6.TRACE:7.OPTIONS: 二.各个方法介绍: 1.GET方法: 对这个资源的 ...
- 元素的组合(dfs)
无重复元素的组合 输入一串小些字母(无重复字母),从中取出k(k<10)个字母,输出组合情况.样例:输入:abcd3输出:abcabdacdbcd 一道搜索的题,想办法建图或是画搜索树. 这里推 ...