题意简述

翻译很清楚了

题目解法

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

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

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

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

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

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

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

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

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

#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. 错题笔记:int a=b=1这样定义为什么是错误的

    C语言中定义同一类型的多个变量必须以逗号分隔.如: int a,b,c ; =在C语言中是赋值运算符,等号左边的变量,必须是已以定义好的变量才可以. int a=b=1 ; 中,若b已经定义,则是正确 ...

  2. grpc start with python

    pip install grpcio grpcio-tools syntax = "proto3"; service FutureData { rpc GetTick(ReqTic ...

  3. CSS中Position几种属性的总结

    定位position 定位方向:left  right  top  bottom 静态定位:static  默认值,就是文档流 绝对定位:absolute    特点: 1.不占据原来的位置(脱标) ...

  4. px 转化 为 rpx

    小程序 的 px 转化为rpx 在 获取 屏幕高度 后 ,这个单位是px ,可是我的项目是用rpx,所以这里就涉及一个转化的公式了 1rpx = 750 / 设备屏幕宽度 所以 wx.getSyste ...

  5. noi 1.1 3 对齐输出

    描述 输入三个整数,按每个整数占8个字符的宽度,右对齐输出它们. 输入 只有一行,包含三个整数,整数之间以一个空格分开. 输出 只有一行,按照格式要求依次输出三个整数,之间以一个空格分开. 样例输入 ...

  6. 编辑器(Editor) vs 集成开发环境(Integrated Development Environment,下文简称 IDE)

    编辑器(Editor) vs 集成开发环境(Integrated Development Environment,下文简称 IDE) 经常看到一些程序员拿编辑器和 IDE 进行比较,诸如 Vim 比 ...

  7. list与linkedlist(添加、删除元素)

    1)jdk1.8中list遍历过程中可以直接删除元素了(jdk1.7可以通过倒序遍历删除或iterator遍历删除元素) List<Integer> list = new ArrayLis ...

  8. CSS设置边距

    1.内边距 所有的 ​HTML ​元素基本都是以矩形为基础. 每个 HTML 元素周围的矩形空间由三个重要的属性来控制: ​padding(内边距)​ ​margin(外边距)​ ​border(边框 ...

  9. Vue系列---【.npmrc文件设置私服地址】

    一..npmrc 配置文件的优先级 电脑中有多个 .npmrc 文件,在我们安装包的时候,npm按照如下顺序读取这些配置文件 项目配置文件: /project/.npmrc 用户配置文件:~/.npm ...

  10. VUE项目中检测网页滑动注意事项

    一.this.$nextTick(function () {             window.addEventListener('scroll', this.onScroll, true)   ...