lly的瞬移方块

Description

llyllylly最近发明了一个叫瞬移方块的游戏,为啥llyllylly这么闲呢,这得从一只蝙蝠说起.....

llyllylly决定给大家也分享一下这个游戏,游戏规则是这样的,有一个长度为nnn的方块序列,每个方块有对应的能量值aia_iai​,游戏就是获取最大的能量值,但是只能选择mmm个位置,如果方块就是这样静止不动的话,也太简单了,聪明的llyllylly显然不会玩这么弱智的游戏,这个游戏的方块能量是可以瞬移的!!(所以才叫瞬移方块嘛),对于当前位置的idiid_iidi​你会知道他下一瞬间会瞬移到哪个位置(就是能量瞬移),我们能做的就是选好mmm个位置,无论瞬移否,这个位置任意时刻的能量值我们都可以获取,那么请大家开始愉快的玩耍吧。

Input

第一行包含两个整数n,(1≤n,m≤105)n,(1 \leq n,m \leq 10^5)n,(1≤n,m≤105)。

第二行有nnn个整数表示第iii个位置的方块能量值为ai,(1≤ai≤105)a_i,(1 \leq a_i \leq 10^5)ai​,(1≤ai​≤105)。

第三行有nnn个整数表示第iii个位置的方块下一瞬间会瞬移到的位置idi,(1≤idi≤n)id_i,(1 \leq id_i \leq n)idi​,(1≤idi​≤n)。

Output

输出包含一个整数即答案。

Sample Input 1

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

Sample Output 1

36

Sample Input 2

8 2
1 2 3 4 1 2 3 12
2 3 3 3 6 7 5 8

Sample Output 2

22

Hint

对于第一个样例:我们可以选择第222和第888方块的位置获取任意时刻的能量值,答案为1+2+3+4+5+6+7+8=36

对于第二个样例:我们可以选择第333和第888方块的位置获取任意时刻的能量值,答案为1+2+3+4+12=22

Source

nuoyanli

思路

  • 题意:给我们一个 n 个数的序列代表n个位置,每个位置包含一定的能量,这些能量在每一瞬间会转移,怎么转移呢?之后又给了一个长为n的序列br【】,在这个序列中 br[ i ] = x 也就是 第i个位置的能量最终会转移到 x 位置,这样经过了无线多个瞬间之后,那么能量就可以认为是保持确定位置了

  • 思路:这一题真是挺不错的,巧妙的把 并查集 的知识融入到题目中,如果我们用并查集的思想去理解这一题,那么问题就简单了,我们把 两个位置之间进行能量转化, 看作一对关系把它们放入同一个集合中去,当对n个位置都进行合并集合操作之后, 那么我们只需要讨论 每个集合中 能量的综合就行了(巨弱的我咋没想到,,不过还是要感谢lly学张的 精心出题)

代码

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std; #define ll long long
const int Len = 1e5 + 10;
ll ar[Len];
ll br[Len];
ll sum[Len]; ll find(ll x) { return x == br[x] ? x : br[x] = find(br[x]); }
void Union(int x, int y)
{
ll fx = find(x);
ll fy = find(y);
if(fx != fy)
br[fx] = fy;
} void init()
{
for(int i = 0; i < Len; i ++)
br[i] = i;
} int main()
{
/* freopen("A.txt","r",stdin); */
init(); //初始化并查集中的元素,不要忘了
int n, m;
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i ++)
scanf("%lld", &ar[i]);
int next;
for(int i = 1; i <= n; i ++)
{
scanf("%d", &next);
Union(i, next);
} for(int i = 1; i <= n; i ++)
sum[find(br[i])] += ar[i]; //遍历每个节点,把属于同一个集合的点加入到相同的下标sum sort(sum + 1, sum + 1 + n, greater<ll>());
ll ans = 0;
for(int i = 1; i <= m; i ++)
ans += sum[i];
printf("%lld\n", ans); return 0;
}

lly的瞬移方块(并查集)的更多相关文章

  1. bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...

  2. 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏

    算是挺基础的东西 Description     约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱.    游戏开始后,约翰会给贝茜发出P(1≤P ...

  3. 洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)

    题目描述 约翰和贝茜在玩一个方块游戏.编号为 1\ldots n 1-n 的 n n ( 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始 ...

  4. 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集

    这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...

  5. bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...

  6. [POJ 1988] Cube Stacking (带值的并查集)

    题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x) ...

  7. 并查集 Union-Find

    并查集能做什么? 1.连接两个对象; 2.查询两个对象是否在一个集合中,或者说两个对象是否是连接在一起的. 并查集有什么应用? 1. Percolation问题. 2. 无向图连通子图个数 3. 最近 ...

  8. [HDOJ2818]Building Block(带权并查集,路径压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818 题意:有N个块,每次有两个操作: M x y表示把x所在的那一堆全部移到y所在的那一堆的下方. ...

  9. 【HDU 3810】 Magina (01背包,优先队列优化,并查集)

    Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of ...

随机推荐

  1. Flutter的盒子约束

    由Expanded widget引发的思考 设计稿如下 布局widget分解 很常见的一种布局方式:Column的子widget中包含ListView @override Widget build(B ...

  2. C#.Net全栈工程师之路-学习路径

    C#.Net全栈工程师之路-学习路径 按架构分: C/S架构: B/S架构: Mobile移动开发: 按技术点分: C#编程基础以及OOP面向对象编程: 数据库基础以及高级应用(MYSQL+MSSQL ...

  3. video标签加载视频有声音却黑屏

    问题 昨天用户上传了一个视频文件,然而发现虽然有声音但是黑屏. 解释 因为原视频的编码是用 mp4v 格式的,它需要专用的解码器.而 chrome 并不支持,所以无法播放. 然后如果用转码功能转成用 ...

  4. ggplot2(4) 用图层构建图像

    4.1 简介 qplot()的局限性在于它只能使用一个数据集和一组图形属性映射,解决这个问题的办法就是使用图层.每个图层可以有自己的数据集和图形属性映射,附加的数据元素可通过图层添加到图形中. 一个图 ...

  5. [android]从书中编码方式,看编程思想

    <Android权威编程指南第3版>今天学习到第10章,感叹经验丰富的编程理念——解耦合. 编程理念肯定是尽可能解除耦合,让代码可以复用,书中多次提到关于参数传递的解耦,这又出现一次. 本 ...

  6. 面试官:HashMap死循环形成的原因是什么?

    介绍 HashMap实现原理 之前的文章已经分析了HashMap在JDK1.7的实现,这篇文章就只分析HashMap死循环形成的原因 死循环形成是在扩容转移元素的时候发生的 void resize(i ...

  7. 判断 tableZen 是否有 横向滚动条

    判断 tableZen 是否有 横向滚动条 const outWidth = this.$refs.tableInnerZen.$el.clientWidth ].$el.clientWidth

  8. 【Weiss】【第03章】练习3.13:桶排序

    [练习3.13] 利用社会安全号码对学生记录构成的数组排序.编写一个程序进行这件工作,使用具有1000个桶的基数排序并且分三趟进行. Answer: 首先,对社会安全号码不了解的就把它当成一个不超过9 ...

  9. Http报文和Request和Response的常用方法

    简述 它是HTTP应用程序之间发送的数据块.这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分.这些报文都是在客户端.服务器和代理之间流动. HTTP报文的流 ...

  10. Python3学习之路~9.4 队列、生产者消费者模型

    一 队列queue 当必须在多个线程之间安全地交换信息时,队列在线程编程中特别有用. 队列的作用:1.解耦,使程序直接实现松耦合 2.提高处理效率 列表与队列都是有顺序的,但是他们之间有一个很大的区别 ...