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. Vue项目三、项目中碰到的问题详解

    一.组件的划分创建 方法一: 把页面上需要复用的模块,拆分成组件.比如,页面的header.footer.面包屑.弹出框等拆分成组件.所以在src中应该有一个文件夹(components)专门放这些会 ...

  2. Map - 与君初相识

    前言 生活中,我们常会看到这样一种集合:IP地址与主机名,身份证号与个人等,这种一 一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对应关系的对象,即 java.util.Map 接口 ...

  3. 【工具】---- webpack简析

    1. 什么是webpack 一个现代 JavaScript 应用程序的静态模块打包器(module bundler),它会分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行 ...

  4. PHP攻击网站防御代码-以及攻击代码反译

    <?php //查询禁止IP $ip =$_SERVER['REMOTE_ADDR']; $fileht=".htaccess2"; if(!file_exists($fil ...

  5. PG归并排序算法详解

    前言 归并排序算法是连接算法中比较复杂的算法,相比嵌套循环与Hash匹配而言.本节会通过实例来说明该算法在PG中的具体实现. 在PG中,通过状态机来实现--归并-连接.当然这里的完整流程是排序--归并 ...

  6. $props, $attrs,$listeners的具体使用例子

    我在这使用属性重新render饿了么ui的tree: <el-tree ref="tree" icon-class="fa fa-caret-right" ...

  7. 2016 Multi-University Training Contest 4 T9

    http://acm.hdu.edu.cn/showproblem.php?pid=5772 最大权闭合子图. 得到价值w[i][j]的条件是选了i,j这两个位置的字符.选择位置的i字符花费为 第一次 ...

  8. Windows10专业版+Microsoft office2016专业增强版免费无毒官方正版装机教程(简)

    win10: 1.官网制作系统盘(具体见官网提示) 2.备份C盘 3.重启,主板调到USB优先(重启后疯狂按F12或del,具体看主板型号) 4.安装(这个看造化) 5.激活 slmgr /ipk N ...

  9. Fluent算例精选|03利用VOF和蒸发-冷凝模型

    通过学习本算例您将获得? 1.学会基本的VOF模型设置流程 2.学会利用蒸发-冷凝模型来模拟传热沸腾 目录 1摘要4 2传热沸腾模型介绍4 3前处理4 4求解设置5 4.1启动Fluent5 4.2网 ...

  10. Vue-Cli4笔记

    Vue-Cli4与Vue-Cli2区别浅谈 当时学习 Vue-Cli 的时候看的是 Vue-Cli2 的相关教程,当把 package.json 上传 github 的时候提醒有安全问题,于是准备使用 ...