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. SpringBoot1.5.10.RELEASE整合druid

    1.先在pom文件中导入druid的jar包 <dependency> <groupId>com.alibaba</groupId> <artifactId& ...

  2. Navicat for MySQL12破解

    本文摘抄自:https://blog.csdn.net/zhangli0910/article/details/83785147,https://blog.csdn.net/mmake1994/art ...

  3. 06 Linux 的常用命令

    Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作.文件存取.目录操作.进程管理.文件权限 设定等 在职场中,大量的 服务器维护工作 都是在 远程 通过 SSH 客户端 来完成的 ...

  4. TCP报文首部

    源端口和目的端口,各占2个字节,每个TCP报文段都包含源端口号和目的端口号,用于寻找发送端和接收端的应用进程: 序号,占4个字节,序号用来标识从TCP发送端向TCP接收端发送的数据字节流,它表示在这个 ...

  5. 安装部署hyperledger fabric1.0

    安装环境 CentOS7 1.安装Docker Docker Hub在国外,安装会较慢,可用国内镜像DaoCloud.可执行以下命令安装Docker. sudo yum install -y yum- ...

  6. PageRank 算法初步了解

    前言 因为想做一下文本自动摘要,文本自动摘要是NLP的重要应用,搜了一下,有一种TextRank的算法,可以做文本自动摘要.其算法思想来源于Google的PageRank,所以先把PageRank给了 ...

  7. Geotools在shapefile路网数据中建立缓冲区,并获取缓冲区内的要素

    记录一下如何创建创建缓冲区并获取缓冲区内的要素,便于以后查找使用 static SimpleFeatureSource featureSource = null; static CoordinateR ...

  8. 【分布式锁】03-使用Redisson实现RedLock原理

    前言 前面已经学习了Redission可重入锁以及公平锁的原理,接着看看Redission是如何来实现RedLock的. RedLock原理 RedLock是基于redis实现的分布式锁,它能够保证以 ...

  9. js 验证输入框是否为空

    很多时候,菜鸟在对输入框是否输入值进行验证时,总会把输入“空字符串”这一状况给忽略掉.嗯,我就这样,所以记下,以后回忆下还是不错滴 <input type="text" id ...

  10. python如何通过正则表达式一次性提取到一串字符中所有的汉字

    1.python如何通过正则表达式一次性提取到一串字符中所有的汉字 https://blog.csdn.net/py0312/article/details/93999895 说明:字符串前的 “ r ...