题目链接: 号码牌

大致题意

给定一个长度为nnn的序列, 第iii个位置的值为aia_iai​. (保证aaa是111~nnn的一个排列)

每个位置还有一个值did_idi​, 若满足∣i−j=di∣|i-j=d_i|∣i−j=di​∣, 表示位置iii和位置jjj可以进行任意次交换.

问: 能否使得最终的序列满足ai=ia_i = iai​=i.

解题思路

并查集 (数据太小了, 比赛时写了个Floyd)

由于两个位置的交换次数是任意次. 因此, 如果xxx和yyy可以交换, 且yyy和zzz可以交换, 则x,y,zx, y, zx,y,z三个位置处的aaa值可以互换.

上述分析可以推广到一个有限大小的连通集合中.

因此, 我们只需要判断每个连通集合内部aia_iai​值是否和该集合下标iii相同即可.


Floyd

设mp[]mp[]mp[], 其中mp[val]mp[val]mp[val]记录valvalval元素所处原序列的位置.

我们考虑题目的本质: 如果有ai≠ia_i \ne iai​​=i, 表明iii位置需要与mp[a[i]]mp[a[i]]mp[a[i]]位置进行交换. 即: 我们需要判断i,ji, ji,j两个位置是否可达. 我们比较容易想到通过多源最短路进行处理.

考虑到本题并不需要求出两点的距离, 只需要判断是否可达, 因此若采用FloydFloydFloyd算法, 第三层循环可以认为是在求并集, 我们可以通过bitsetbitsetbitset进行优化.

写上这个做法, 主要感觉这个题作为bitsetbitsetbitset优化FloydFloydFloyd入门题很友好.

AC代码

并查集DSU

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 1E2 + 10;
int a[N], d[N];/* 并查集模版 */
struct DSU {int p[N];int find(int x) { return x == p[x] ? x : p[x] = find(p[x]); }void merge(int a, int b) {a = find(a), b = find(b);if (a == b) return;p[b] = a;}void init(int n) { rep(i, n) p[i] = i; }
}dsu;vector<int> v1[N], v2[N];
int main()
{int n; cin >> n;rep(i, n) scanf("%d", &a[i]);rep(i, n) scanf("%d", &d[i]);dsu.init(n);rep(i, n) {int x = i - d[i], y = i + d[i];if (x >= 1) dsu.merge(i, x);if (y <= n) dsu.merge(i, y);}rep(i, n) v1[dsu.find(i)].push_back(a[i]), v2[dsu.find(i)].push_back(i);bool flag = 1;rep(i, n) {if (i != dsu.find(i)) continue;sort(v1[i].begin(), v1[i].end());if (v1[i] != v2[i]) flag = 0;}puts(flag ? "YES" : "NO");return 0;
}

Floyd + bitset

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 1; i <= (n); ++i)
using namespace std;
typedef long long ll;
const int N = 1E2 + 10;
int a[N], d[N], mp[N];
bitset<N> can[N];void fact(int a, int b) { can[a][b] = can[b][a] = 1; }
int main()
{int n; cin >> n;rep(i, n) scanf("%d", &a[i]), mp[a[i]] = i;rep(i, n) {scanf("%d", &d[i]);if (i - d[i] > 0) fact(i, i - d[i]);if (i + d[i] <= n) fact(i, i + d[i]);can[i][i] = 1;}rep(k, n) rep(i, n) {if (can[i][k]) can[i] |= can[k];}bool flag = 1;rep(i, n) flag &= can[i][mp[i]];puts(flag ? "YES" : "NO");return 0;
}

END

AcWing4084 号码牌 (并查集 / bitset优化Floyd)相关推荐

  1. 【牛客 - 368D】动态连通块(并查集+bitset优化)

    题干: 小T有n个点,每个点可能是黑色的,可能是白色的. 小T对这张图的定义了白连通块和黑连通块: 白连通块:图中一个点集V,若满足所有点都是白点,并且V中任意两点都可以只经过V中的点互相到达,则称V ...

  2. 牛客 - 牛半仙的妹子图(并查集+bitset/克鲁斯卡尔重构树+主席树)

    题目链接:点击查看 题目大意:给出一个由 n 个点和 m 条边组成的连通图,每个点都有一种颜色,每条边都有一个权值,现在规定一个起点 st,再给出 q 次询问,每次询问给出区间 [ l , r ] , ...

  3. hdu 5036 Explosion bitset优化floyd

    http://acm.hdu.edu.cn/showproblem.php?pid=5036 题意就是给定一副有向图,现在需要走遍这n个顶点,一开始出发的顶点是这n个之中的随便一个. 如果走了1,那么 ...

  4. 数据结构之并查集:UF-Tree优化并查集——19

    并查集的优化 在上一节了解到并查集的快速查询,合并,判断归属组等操作,虽然这些操作都非常方便,但是在数据量较大的情况下,并查集的效率并不算高: 上一节中实现代码中使用的合并方法(merge,API设计 ...

  5. BZOJ 2342 [Shoi2011]双倍回文(manacher+并查集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2342 [题目大意] 记Wr为W串的倒置,求最长的形如WWrWWr的串的长度. [题解] ...

  6. POJ 并查集 题目汇总 ——czyuan原创(转)

    继续数据结构的复习,本次的专题是:并查集. 并查集,顾名思义,干的就是"并"和"查"两件事.很多与集合相关的操作都可以用并查集高效的解决. 两个操作代码:    ...

  7. leetcode 684. Redundant Connection | 684. 冗余连接(并查集)

    题目 https://leetcode.com/problems/redundant-connection/ 题解 并查集问题 1)有若干个样本a.b.c.d-类型假设是V 2)在并查集中一开始认为每 ...

  8. 算法与数据结构——并查集

    文章推荐:[算法与数据结构]-- 并查集 例子: 数据结构--最小生成树之克鲁斯卡尔算法(Kruskal) 1.2 并查集思想(重点) 我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所有点 ...

  9. 并查集算法c语言版,并查集及其C程序实现.doc

    并查集及其C程序实现 等价关系与等价类 从数学上看,等价类是一个对象(或成员)的集合,在此集合中的所有对象应满足等价关系.若用符号"≡"表示集合上的等价关系,那么对于该集合中的任意 ...

最新文章

  1. 查看.Net Framework版本号
  2. ”System.Configuration.ConfigurationSettings.AppSettings“ 已过时----解决方案
  3. 重装系统,配置CVS
  4. 获取今天,昨天,本周,上周,本月,上月时间
  5. Android 利用jsoup解析 html
  6. 计算机网络犯罪和一般犯罪的不同,论计算机网络犯罪题稿.doc
  7. Liferay6.2.1 集成 CAS4.0 实现单点登录与应用系统集成
  8. 回顾2006年:网络通信十大事件
  9. ofd文件怎么打开?怎么转换成pdf格式发票?ofd文件打开教程
  10. Seaweedfs的安装和使用
  11. JS实现页面保存为图片
  12. 苹果xsmax有高通基带吗_苹果iPhone 12拆解:确认采用高通骁龙X55基带芯片
  13. 雅虎将提供PHP网站托管服务
  14. n2n内网穿透神器--可以用于设置rac搭建时的网卡(在云平台上有用)
  15. 《社会企业开展应聘文职人员培训规范》团体标准在新华书店上架
  16. 数据库之查询表product——统计所有库存商品的总价值
  17. 二、Esp32开发环境快速搭建(vscode+PlatformIO IED)
  18. 计算机组策略定时开机脚本,批处理+组策略 实现规定时间段无法开机and定时关机...
  19. 宏基因组分析教程-Analysis of Metagenomic Data
  20. sql语句的各种模糊查询

热门文章

  1. 香港证券监管机构发布STO详细指南
  2. VC维的来龙去脉 | 火光摇曳
  3. 中国移动互联网测试开发大会(简称MTSC大会)
  4. linux 上下文切换时对用户task和内核task区别对待——针对fpu
  5. 【调参19】如何使用梯度裁剪(Gradient Clipping)避免梯度爆炸
  6. mysql的定点数_在MySQL中,定点数类型只有DECIMAL类型。
  7. Facebook sdk嵌入,登陆与注销
  8. 实战教程 | 用让新海诚本人惊讶的 AI 模型制作属于你的动漫视频
  9. JavaScript实现蜘蛛纸牌
  10. android小游戏源码拼图,android编写的数字拼图游戏(带详细注释)