Portal --> cf859E

Solution

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

​  注意到这个图可能包含多个连通块,每个连通块可以独立计算,那么最后的答案应该就是各个连通块计算结果的乘积,那么现在我们的问题就是怎么算一个连通块内的答案

​​  考虑一个包含\(n\)个点的连通块,我们来分析一下这个连通块的性质:首先因为这是一个连通块,所以边数\(m>=n-1\),然后注意到这题中有一个性质:原方案中没有两个人选的是同一个位置(点),所以我们可以得到边数\(m<=n\)

​  所以一个包含\(n\)个点的连通块只可能有两种情况:

1、\(m=n-1\):这个时候是一棵树,那么答案就应该是\(n\)(树中的节点个数),具体的话就是考虑哪个节点没有人选,所以就有\(n\)种方案

2、\(m=n\):这个时候如果是一个基环树,考虑环中的边数和点数相同,所以环中所有的点只能被环上的边选,这样一来树中能选的点数和要选的边数相等,所以树中的方案是唯一的,环中的方案只有两种,所以这个时候有\(2\)中方案;但是!如果说这个环是个自环,那就只有一种方案了,因为环中不能移动

​  所以我们直接并查集判断一下统计一下就好了

​  

​​  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1e5+10,MOD=1e9+7;
int f[N*2],in[N*2],cnt[N*2],mark[N*2];
int n,m,tot,ans;
int get_f(int x){return f[x]=f[x]==x?f[x]:get_f(f[x]);}
int mul(int x,int y){return 1LL*x*y%MOD;} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
int x,y;
scanf("%d",&n);
for (int i=1;i<=2*n;++i) f[i]=i,cnt[i]=1,mark[i]=0;
ans=1;
int tmp=0;
for (int i=1;i<=n;++i){
scanf("%d%d",&x,&y);
get_f(x); get_f(y);
mark[x]=1;
tmp=max(tmp,max(x,y));
if (x==y) continue;
if (f[x]==f[y]) ans=mul(ans,2);
cnt[f[y]]+=cnt[f[x]];
f[f[x]]=f[y];
}
int debug=0;
for (int i=1;i<=2*n;++i)
if (!mark[i])
ans=mul(ans,cnt[i]),++debug;
printf("%d\n",ans);
}

【cf859E】Desk Disorder的更多相关文章

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

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

  2. 「CF859E」Desk Disorder

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

  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. 【POJ3481】【splay】Double Queue

    Description The new founded Balkan Investment Group Bank (BIG-Bank) opened a new office in Bucharest ...

  5. jQuery学习之旅 Item1 选择器【一】

    点击"名称"会跳转到此方法的jQuery官方说明文档. 1. 基础选择器 Basics 名称 说明 举例 #id 根据元素Id选择 $("divId") 选择I ...

  6. 【Android】4.2 资源限定符和可视化选项

    分类:C#.Android.VS2015:创建日期:2016-02-06 在设计界面中,所有资源都可以被限定为使用哪个国家或地区的语言.例如,将字符串资源限定为默认使用中文等. 将字符串资源限定为默认 ...

  7. 【Android】4.0 Android项目的基本结构

    分类:C#.Android.VS2015: 创建日期:2016-02-06: 修改日期:2016-02-27 一.简介 第3章虽然通过百度地图应用展示了你可能感兴趣的内容,但是,如果你是一个初学者,一 ...

  8. Linux常用命令【总结】

    Linux命令中文版详解:https://linuxtools-rst.readthedocs.io/zh_CN/latest/tool/index.html Linux系统,我用过的有centos和 ...

  9. 【1】循序渐进学 Zabbix :初识与基础依赖环境搭建( LNMP )

    写在前面的话 运维监控是一个很大的话题,在这一块个人接触的比较突出的服务主要有 Nagio 和 Zabbix 两款.而这几年跳过的公司中,Zabbix 一直都是首选且唯一选择,Nagios 没遇到. ...

随机推荐

  1. 关于几个与IO相关的重要概念

    1.读/写IO 读IO就是发指令从磁盘读取某段序号连续的扇区内容.指令一般是通知磁盘开始扇区位置,然后给出需要从这个初始扇区往后读取的连续扇区个数,同时给出动作是读还是写.磁盘收到这条指令就会按照指令 ...

  2. linux获得命令使用帮助

    1. 内部命令: help CMD 2. 外部命令: CMD --help 3. 命令手册: manual(所有命令) man CMD 分章节: 1: 用户命令(User Commands - /bi ...

  3. mac 上面安装 tree 命令

    相信很多使用过Linux的用户都用过tree命令,它可以像windows的文件管理器一样清楚明了的显示目录结构. 但是mac下默认是没有 tree命令的. 1.我们可以使用find命令模拟出tree命 ...

  4. WebGL学习笔记三

    在上一章中主要说明了通过矩阵来实现平面图形的平移.旋转.缩放,到最后完全可以用4*4矩阵实现所有的动作,在本章就是第四章主要是对矩阵进行了封装,其WebGL的流程和上一章大部分大部分相同,定义可以在w ...

  5. 《UML大战需求分析》-读后感二

    活动图将流成分解为一个一个的活动,通过活动的先后顺序来展示流程,而状态机图是从某个事物的状态是如何转变的角度来展示流程,首先确定事物,然后找出状态,状态之间的箭头叫转换,箭头上的文字说明了是什么事情导 ...

  6. Beta 冲刺 (3/7)

    队名:日不落战队 安琪(队长) 过去两天完成了那些任务 上传个人信息. 接下来的任务 建立和上传收藏夹. 还剩下的任务 完善手写涂鸦. 社交模块. 遇到的困难 暂无. 有哪些收获和疑问 收获:okht ...

  7. 学习率(Learning rate)的理解以及如何调整学习率

    1. 什么是学习率(Learning rate)?   学习率(Learning rate)作为监督学习以及深度学习中重要的超参,其决定着目标函数能否收敛到局部最小值以及何时收敛到最小值.合适的学习率 ...

  8. 分离链表法散列ADT

    分离链表法解决冲突的散列表ADT实现 数据结构定义如下: struct ListNode; typedef struct ListNode *Position; struct HashTbl; typ ...

  9. 10th 本周工作量及进度统计

    本周PSP C(类别) C(内容) S(开始时间) ST(结束时间) I(中断时间) T(实际时间) 文档 11月22日 规格说明书练习 10:23­ 15:30 132 175 11月23日 知识点 ...

  10. jsp页面has already been called for this response错误解决方法。

    创建验证码的jsp页面提示错误:has already been called for this response <%@ page contentType="image/jpeg&q ...