AtCoder Beginner Contest 247 F - Cards // dp + 并查集
题意:
给定N张牌,每张牌正反面各有一个数,所有牌的正面、反面分别构成大小为N的排列P,Q。
求有多少种摆放方式,使得N张牌朝上的数字构成一个1~N的排列。
思路:dp + 并查集
建图:有1~N的顶点,然后Pi跟Qi连一条边。
因为给定的是两个排列,所以每个点的度数为2,因而建出的图必然是由几个独立的环构成。
根据乘法原理,答案就等于每个环的方案数相乘。
求每个环的方案数:
假设环的大小为n(点的数量),dp[n]表示这样的环的方案数:dp[1] = 1,dp[2] = 3,当 n >= 3 时,dp[n] = dp[n - 1] + dp[n - 2]。
上述结论证明:因为每个点都要选出,每个点又跟两条边相连,因此选边时:若此边不选,下条边必须选;若此边已选,下条边可选可不选。那么对于n - 1个点的环,插入第n个点,就由两种情况转移过来。
判环及求环的大小:
并查集可以很好的完成任务 : )
(不得不说并查集真的是简洁又好用的数据结构
代码参考:
//Jakon:dp + 并查集
#include <bits/stdc++.h>
#define int long long
using namespace std; const int mod = 998244353;
const int N = 200010; int n, p[N], q[N], dp[N], fa[N], siz[N]; int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
} signed main()
{
cin >> n;
for(int i = 1; i <= n; i++) cin >> p[i];
for(int i = 1; i <= n; i++) cin >> q[i]; dp[1] = 1, dp[2] = 3;
for(int i = 3; i <= n; i++) dp[i] = (dp[i - 1] + dp[i - 2]) % mod; for(int i = 1; i <= n; i++) fa[i] = i, siz[i] = 1;
for(int i = 1; i <= n; i++) {
int x = find(p[i]), y = find(q[i]);
if(x != y) fa[x] = y, siz[y] += siz[x];
} int ans = 1;
for(int i = 1; i <= n; i++)
if(fa[i] == i) ans = ans * dp[siz[i]] % mod;
cout << ans << endl; return 0;
}
AtCoder Beginner Contest 247 F - Cards // dp + 并查集的更多相关文章
- AtCoder Beginner Contest 120 D - Decayed Bridges(并查集)
题目链接:https://atcoder.jp/contests/abc120/tasks/abc120_d 题意 先给m条边,然后按顺序慢慢删掉边,求每一次删掉之后有多少对(i,j)不连通(我应该解 ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 182 F
F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...
- AtCoder Beginner Contest 261 F // 树状数组
题目链接:F - Sorting Color Balls (atcoder.jp) 题意: 有n个球,球有颜色和数字.对相邻的两球进行交换时,若颜色不同,需要花费1的代价.求将球排成数字不降的顺序,所 ...
- AtCoder Beginner Contest 260 F - Find 4-cycle
题目传送门:F - Find 4-cycle (atcoder.jp) 题意: 给定一个无向图,其包含了S.T两个独立点集(即S.T内部间的任意两点之间不存在边),再给出图中的M条边(S中的点与T中的 ...
- AtCoder Beginner Contest 253 F - Operations on a Matrix // 树状数组
题目传送门:F - Operations on a Matrix (atcoder.jp) 题意: 给一个N*M大小的零矩阵,以及Q次操作.操作1(l,r,x):对于 [l,r] 区间内的每列都加上x ...
- AtCoder Beginner Contest 249 F - Ignore Operations // 贪心 + 大根堆
传送门:F - Keep Connect (atcoder.jp) 题意: 给定长度为N的操作(ti,yi). 给定初值为0的x,对其进行操作:当t为1时,将x替换为y:当t为2时,将x加上y. 最多 ...
- AtCoder Beginner Contest 133 F Colorful Tree
Colorful Tree 思路: 如果强制在线的化可以用树链剖分. 但这道题不强制在线,那么就可以将询问进行差分,最后dfs时再计算每个答案的修改值, 只要维护两个数组就可以了,分别表示根节点到当前 ...
- AtCoder Beginner Contest 132 F Small Products
Small Products 思路: 整除分块+dp 打表发现,按整除分块后转移方向如下图所示,上面的块的前缀转移到下面的块 代码: #pragma GCC optimize(2) #pragma G ...
随机推荐
- 小程序扫码、上传图片、css时间轴
de <!-- 导航 --> <view class="navSec flexBox"> <text class="navItem {{ s ...
- 2022年5月11日,NBMiner发布了41.3版本,在内核中加入了100%LHR解锁器,从此NVIDIA的显卡再无锁卡一说
2022年5月11日,NBMiner发布NBMiner_41.3版本,主要提升了稳定性. 2022年5月8日,NBMiner发布NBMiner_41.0版本,在最新的内核 ...
- [java并发编程]基于信号量semaphore实现限流器
目录 一.什么是信号量 二.信号量类Semaphore 三.实现限流器 欢迎关注我的博客,更多精品知识合集 一.什么是信号量 "信号量"在编程术语中使用单词semaphore,那什 ...
- 其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
前言 目前,使用 AGP Transform API 进行字节码插桩已经非常普遍了,例如 Booster.神策等框架中都有 Transform 的影子.Transform 听起来很高大上,其本质就是一 ...
- 免费yum源镜像地址
收集的镜像,yum源等网站地址 阿里巴巴开源镜像站 https://opsx.alibaba.com/mirror http://mirrors.aliyun.com/centos/ 网易开源镜像站 ...
- Linux磁盘空间查看及空间满的处理
问题 在部署应用到测试环境的时候,有些文件同步出错,最后定位到测试服务器空间满了. 解决 查看磁盘空间还剩多少空间 df -h 查看根目录下每个目录占用空间大小 du --max-depth=1 -h ...
- 153. Find Minimum in Rotated Sorted Array - LeetCode
Question 153. Find Minimum in Rotated Sorted Array Solution 题目大意:给一个按增序排列的数组,其中有一段错位了[1,2,3,4,5,6]变成 ...
- final变量、方法与类
学习内容: 一.final变量 1.设定为final的变量,其值不可被改变. 2.final定义的变量必须在声明时对其进行赋值操作. 3.final可以修饰对象.被修饰为final的对象,只能恒定指向 ...
- python之三元表达式与生成式与匿名与内置函数(部分)
目录 三元表达式 各种生成式 列表生成式(可同样作用于集合) 字典生成式 匿名函数 重要内置函数 map() zip() filter() reduce() 常见内置函数(部分) 三元表达式 三元表达 ...
- 检查MySQL主从复制运行状态
脚本思路: 1.使用MySQL客户端命令"mysql"直接在命令行中运行MySQL指令"show slave status\G;"来查看MySQL主从复制状态信 ...