每日一题打卡 2022-5-14

这道题目考察了如何通过序列中的元素交换来达到特定目标序列。给定两个等长序列a和b,以及交换限制d,我们需要确定是否能通过满足限制的交换使a变为b。使用并查集策略,将可以交换的元素连接,判断最终能否形成目标序列。样例输入和输出展示了问题的解决方案。
摘要由CSDN通过智能技术生成

题目:

有一个由 n 个元素组成的序列 a1,a2,…,an;最初,序列中的每个元素满足ai=i。

对于每次操作,你可以交换序列中第 ii 个元素和第 jj 个元素当且仅当满足 |i−j|=di。

题目给出序列 b1,b2,…,bn 和 d1,d2,…,dn,询问是否可以通过若干次交换,使得序列 a 和序列 b 完全相同。

输入格式:

第 1 行一个正整数 n,含义如上。

第 2 行 n 个正整数表示 b1,b2,…,bn。

第 3 行 n 个正整数表示 d1,d2,…,dn。

输出格式:

若能,输出 YES;否则输出 NO

样例输入:

7
4 2 5 1 3 7 6
4 6 6 1 6 6 1

样例输出:

YES

本题我们可以用并查集的方式来写。

1: 首先我们看题目的意思,我们是需要进行x次交换后然后得到顺序为1 2 3 4 ..... n 的序列,因为x是随意的,我们需要判断的是最后我们能不能交换成我们想要的序列,所以我们只需要找到每一位数能和哪些数交换就好了。

2:因为每一个数最多可以和俩个位置上的数进行交换,所以每一个位置上可以得到的数就可以用并查集连接在一起。

代码:

#include<iostream>
const int N  = 105;
int a[N] , b[N];
int p[N];
int find_x(int x)
{
    return x == p[x] ? x : 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值