题意简述

翻译很清楚了

题目解法

如果一个人想去的位置上原来坐着人,那么他要坐到这个位置上,就要把原来的人赶走。

原来的人被赶走了,就只能去想去的位置。如果那个位置上有人,又要把那个人赶走。

我们发现,如果将每个人原来的位置连一条单向边到想要的位置上,那么这种关系似乎是一棵树。每一个人能换,当且仅当他的父亲能换

这种关系会在什么时候结束呢?第一种情况,到了一个没人坐的节点。这种情况当然皆大欢喜,树上任何一个人,只要他想换,都能换成功(但最多只能成功一个人,因为另一个人如果也想换,就必定会有一个位置上挤着两个想要换的人)。

第二种情况,到了树上一个节点。那么这时就不是树了,这是一棵基环树。对于一棵基环树,我们只有全换和全不换两种情况。同时,树上不属于环的节点肯定都不能换。因为如果换了,那么环上节点必须要换,因为根节点换了。此时必定不会合法。

如果是自环呢?那么这个节点相当于不能换。不能换,也就不能被赶走。这棵树只有一种情况,就是都不换。

这个题就变成了简单的乘法原理。

注意,位置是人的两倍,输入的第一个数是人数

我们可以用并查集查找根节点。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll mod = 1e9 + 7;
const ll maxn = 2e5 + 5;
ll n;
ll fa[maxn], si[maxn], a[maxn];
bool ton[maxn];
ll find(ll u){ return (fa[u] == u) ? fa[u] : fa[u] = find(fa[u]); }
signed main(){
freopen("text.in", "r", stdin);
scanf("%lld", &n);
for(ll i = 1;i <= 2 * n;i ++) fa[i] = i, si[i] = 1;
ll u, v;
for(ll i = 1;i <= n;i ++)
{
scanf("%lld%lld", &u, &v);
a[u] = v;
if(u == v) continue;
ll U = find(u), V = find(v);
// cout << u << ' ' << v << ' ' << U << ' ' << V << endl;
if(U == V)
{
si[V] = -1;
}
else
{
fa[U] = V;
if(si[V] != -1) si[V] += si[U];//每一个人开始的位置是不同的,所以只有根节点可能形成环
}
}
ll ans = 1;
for(ll i = 1;i <= 2 * n;i ++)
{
ll zu = find(i);
if(ton[zu] == 1 || (a[zu] == zu) || si[zu] == -2) continue;
ton[zu] = 1;
if(si[zu] == -1) si[zu] = 2;
ans *= si[zu];
ans %= mod;
}
printf("%lld\n", ans);
return 0;
}

CF859E题解的更多相关文章

  1. CF859E 题解

    分析 我们不妨把这些座位看作是一张图中的节点,把每个人的诉求作为一条边(由[原座位]指向[想去的座位]) 比如,对于样例#1,我们就可以得到这样一张图: 显然,我们有可能会得到多个连通图(比如上面这张 ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  10. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

随机推荐

  1. docker 清除redis缓存

    1.仓库容器id: docker  ps 2.进入容器:docker exec -it 容器id  redis-cli 3.清除所有缓存:flushall

  2. Web实时通信之SignalR

    前言 对于B/S模式的项目,基础的场景都是客户端发起请求,服务端返回响应结果就结束了一次连接:但在很多实际应用场景中,这种简单的请求和响应模式就显得很吃力,比如消息通知.监控看板信息自动刷新等实时通信 ...

  3. Hive. 函数 instr 的用法

    INSTR(C1,C2,I,J) 在一个字符串中搜索指定的字符,返回发现指定的字符的位置; C1 被搜索的字符串 C2 希望搜索的字符串 I 搜索的开始位置,默认为1 J 出现的位置,默认为1 sel ...

  4. oracle表中增加字段sql

    declare v_Count1 int := 0; v_Count2 int := 0;begin select count(1) into v_Count1 from user_all_table ...

  5. 项目实训 DAY 10

    今天,我写了一些前端代码规范,并按规范修改了一下代码.规范写到了README.md上

  6. Hive+spark工业化项目

    DolphinScheduler:国产调度平台 airflow: 调度平台

  7. openwrt扩容

    方法二.三记得先使用Linux系统打开 GParted -- Download 方法三偏移地址获取: 1. 运行的openwrt安装losetup 2. 安装完毕后执行:losetup 获取偏移地址. ...

  8. MySQL数据库本地连接失败

    前提: MySQL5.5 + SQLyog软件,从安装开始一直可以正常使用 现象: 用SQLyog软件登录,显示本地连接失败.怀疑可能是MySQL服务没有开启,结果发现服务里面找不到MySQL这一条( ...

  9. houdini python 配置 vscode 环境

    一.在我的文档python文件夹中找到houdini.env文件,打开,加入语句 EDITOR = vscode路径 例如:EDITOR = D:\vscode\Microsoft VS Code\C ...

  10. Python笔记(4)——元组(Python编程:从入门到实践)

    元组 1. 元组:不可变的列表.元组一经创建不能被修改. 2. 表示:用圆括号()来表示,并用逗号来分隔其中的元素.可通过索引访问其元素. 3. 访问:访问列表元素,指出元组的名称,再指出元素的索引, ...