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
输出包含一个整数即答案。
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的瞬移方块(并查集)的更多相关文章
- bzoj3376/poj1988[Usaco2004 Open]Cube Stacking 方块游戏 — 带权并查集
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3376 题目大意: 编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方 ...
- 初涉「带权并查集」&&bzoj3376: [Usaco2004 Open]Cube Stacking 方块游戏
算是挺基础的东西 Description 约翰和贝茜在玩一个方块游戏.编号为1到n的n(1≤n≤30000)个方块正放在地上.每个构成一个立方柱. 游戏开始后,约翰会给贝茜发出P(1≤P ...
- 洛谷P5092 [USACO2004OPEN]Cube Stacking 方块游戏 (带权并查集)
题目描述 约翰和贝茜在玩一个方块游戏.编号为 1\ldots n 1-n 的 n n ( 1 \leq n \leq 30000 1≤n≤30000 )个方块正放在地上,每个构成一个立方柱. 游戏开始 ...
- 【BZOJ 3376】[Usaco2004 Open]Cube Stacking 方块游戏 带权并查集
这道题一开始以为是平衡树结果发现复杂度过不去,然后发现我们一直合并而且只是记录到最低的距离,那么就是带权并查集了,带权并查集的权一般是到根的距离,因为不算根要好打,不过还有一些其他的,具体的具体打. ...
- bzoj 3376 [Usaco2004 Open]Cube Stacking 方块游戏——带偏移量的并查集
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3376 带偏移量的并查集. #include<iostream> #include ...
- [POJ 1988] Cube Stacking (带值的并查集)
题目链接:http://poj.org/problem?id=1988 题目大意:给你N个方块,编号从1到N,有两种操作,第一种是M(x,y),意思是将x所在的堆放到y所在的堆上面. 第二种是C(x) ...
- 并查集 Union-Find
并查集能做什么? 1.连接两个对象; 2.查询两个对象是否在一个集合中,或者说两个对象是否是连接在一起的. 并查集有什么应用? 1. Percolation问题. 2. 无向图连通子图个数 3. 最近 ...
- [HDOJ2818]Building Block(带权并查集,路径压缩)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2818 题意:有N个块,每次有两个操作: M x y表示把x所在的那一堆全部移到y所在的那一堆的下方. ...
- 【HDU 3810】 Magina (01背包,优先队列优化,并查集)
Magina Problem Description Magina, also known as Anti-Mage, is a very cool hero in DotA (Defense of ...
随机推荐
- leetcode 249 250 set和map的简单用法
leetcode249,利用了STL中的set class Solution { public: vector<int> intersection(vector<int>&am ...
- (数据科学学习手札79)基于geopandas的空间数据分析——深入浅出分层设色
本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 通过前面的文章,我们已经对geopanda ...
- apache搭建Tomcat集群(Cluster)
搭建集群: apache:特点处理静态资源(html 图片 js等) apache的请求操作,Cluster工具 tomcat:特点处理动态资源 apache+tomcat(apache是web服 ...
- 机器学习基础——简单易懂的K邻近算法,根据邻居“找自己”
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天的文章给大家分享机器学习领域非常简单的模型--KNN,也就是K Nearest Neighbours算法,翻译过来很简单,就是K最近邻居 ...
- 微信小程序用setData修改数组或对象中的一个属性值,超好用,最简单的实现方法,不容错过!大神们 都 在 看 的方法!!!
在page中 data: { info: [{ name: "yuki", tou: "../img/head.jpg", zGong: 130, gMoney ...
- Redis04——五分钟明白Redis的哨兵模式
和所有的数据库一样,Redis也支持集群化,Redis的集群分为分布式集群和主从集群.大部分公司采取的都是主从集群.所以在本篇文章内,我们将着重介绍Redis的主从集群及哨兵机制. 由于Redis的主 ...
- Docker 技术系列之安装Docker Desktop for Mac
终于要进入到Docker技术系列了,感谢大家的持续关注. 为什么要选择Docker?因为Docker 轻巧快速,提供了可行.经济.高效的替代方案.举个例子,安装Nginx,Mysql,Redis等常用 ...
- 浅谈ASP.NET Core中的DI
DI的一些事 传送门马丁大叔的文章 什么是依赖注入(DI: Dependency Injection)? 依赖注入(DI)是一种面向对象的软件设计模式,主要是帮助开发人员开发出松耦合的应用程序 ...
- shell脚本基础-四种启动方式
1.当前路径启动 ./test.sh 2.绝对路径启动 pwd /data/beijing 'pwd'/test.sh 3.指定解释器执行 sh test.sh bash test.sh 4.shel ...
- docker:一文学基础使用
目录 docker介绍 安装与镜像源配置 CentOS7 安装 设置镜像源 补充: 简单使用例子 基础概念 四个概念 镜像概念补充: 容器概念补充: 常用命令: 查看docker信息 镜像操作 容器操 ...