首页 > 其他分享 >并查集跳跃

并查集跳跃

时间:2024-07-21 17:29:44浏览次数:10  
标签:return int 查集 fa ans 跳跃 quad

$\quad $ 在解决区间问题时,如果直接修改或者线段树不好维护且总共的有效修改很小时,我们就可以考虑使用并查集来解决问题。

$\quad $ 问题中的各元素需要满足一定的条件,我们在遍历的时候,如果当前元素修改完之后仍然满足条件,那么我们就可以直接跳到后面的位置后面第一个满足条件的位置,反之,则将当前位置连到后面位置上即可。

一道简单的线段树问题

$\quad $ 观察数据范围可知(这里没有展示),每个数在被开方 \(6\) 次之后就会变成 \(1\) ,在变为 \(1\) 后对其开方无意义,所以我们可以使用并查集维护某位数字之后(包括这位数字)第一个需要开方的数字的位置,这样就可以很快地跳到需要更改的位置,总的更改次数不超过 \(6n\) ,即可通过此题。

点击查看代码
#define yhl 0
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+100;
int fa[N],a[N],n,m,l,r,c[N],k;
int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}
int get_sum(int x){
	if(!x)return yhl;
	int ans=0;
	while(x){ans+=c[x];x-=(x&-x);}
	return ans;
}
void add(int x,int y){
	if(!x)return;
	while(x<=n){c[x]+=y;x+=(x&-x);}
}
signed main(){
	scanf("%lld",&n);
	for(int i=1;i<=n;i++){
		fa[i]=i;
		scanf("%lld",&a[i]);
		add(i,a[i]);
	}
	fa[n+1]=n+1;
	scanf("%lld",&m);
	while(m--){
		scanf("%lld%lld%lld",&k,&l,&r);
		if(k)printf("%lld\n",get_sum(r)-get_sum(l-1));
		else{
			for(int i=find(l);i<=r;i=find(i)){
				int op=(int)sqrt(a[i])-a[i];
				add(i,op);
				a[i]=sqrt(a[i]);
				if(a[i]==1)fa[i]=i+1;
				else i++;
			}
		}
	}
	return yhl;
}

$\quad $ 例题:白雪皑皑

标签:return,int,查集,fa,ans,跳跃,quad
From: https://www.cnblogs.com/0shadow0/p/18314710

相关文章

  • 洛谷B3626(跳跃机器人)解析
     这道题的网址洛谷B3626请速览一遍原题当然,咱们来进行题面关键信息提取 1.机器人从第1个格子出发;2.设机器人目前所在格子的编号为x,则它能够跳到格子的编号可能是x,x+1或2x,也就是说,新跳到格子的编号,可能是比原来格子编号少1或多1,或是其2倍;3.不允许跳出界,举个简单的例子......
  • 代码随想录算法训练营第30天 | 贪心算法 2: 122.买卖股票的最佳时机II、55. 跳跃游戏
    代码随想录算法训练营第30天|贪心算法2:122.买卖股票的最佳时机II、55.跳跃游戏、45.跳跃游戏II、1005.K次取反后最大化的数组和122.买卖股票的最佳时机IIhttps://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/代码随想录https://programmerca......
  • 代码随想录day 29 买卖股票的最佳时机II | 跳跃游戏 | 跳跃游戏II | K次取反后最大化
    买卖股票的最佳时机II买卖股票的最佳时机II解题思路利用贪心算法,只要股票卖了后一天能获利,就买了,所以只要遍历一下整个数组,根据这个算法就能得到最终获利的数目知识点贪心心得歪打正着的一题跳跃游戏跳跃游戏解题思路利用贪心算法,只需要有一次跳转到数组之外说明就能跳......
  • redis学习-12(实现分布式锁、消息队列、缓存一致性问题、单线程快的原因、跳跃表)
    引用以下内容:redis实现分布式锁:Redis分布式锁-这一篇全了解(Redission实现分布式锁完美方案)Redis实现分布式锁的7种方案,及正确使用姿势!redis实现消息队列Redis的学习教程(十)之使用Redis实现消息队列缓存一致性问题想要保证数据库和Redis缓存一致性,推荐采用先更新数......
  • 并查集——AcWing 239. 奇偶游戏
    目录并查集定义运用情况注意事项解题思路AcWing239.奇偶游戏题目描述运行代码代码思路改进思路并查集定义并查集(DisjointSetUnion,简称DSU),是一种树形的数据结构,常用于处理一些不交集的合并及查询问题。在并查集中,元素被分成多个不相交的集合,每个集合由一个代表......
  • Redis数据结构—跳跃表 skiplist 实现源码分析
    Redis是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。Redis的数据结构非常丰富,其中跳跃表(skiplist)是一种重要的数据结构,它被用来实现有序集合(sortedsets)。跳跃表是一种概率型数据结构,它通过多层链表来实现快速的查找操作。跳跃表的结构类似于多层索引,......
  • 并查集的学习及运用
    1.定义在看并查集之前,我们先来看一下并查集是什么:并查集是一种用于管理元素所属集合的数据结构。它也有很多用途:在无向图中找环、判断连个元素是不是一个集合等等,所以用起来也十分方便,代码也很短2.模板intfind(intk){ if(vec[k]==k)returnk;//判断自己还有没有祖先 e......
  • 跳跃系统的完善
     Jump()privatevoidJump(){  if(Input.GetKey(KeyCode.Z))  {    jumpTimer-=Time.deltaTime;    if(jumpTimer>0)    {      rigi.AddForce(newVector2(0,jumpForce),ForceMode2D.Force);      ......
  • 数据结构——并查集 学习笔记
    数据结构——并查集学习笔记并查集是一种用于管理元素所属集合的数据结构,实现为一个森林。并查集中,每棵树表示一个集合,树中的节点表示对应集合中的元素。其思想是,把集合属性绑定到根节点上,避免多余的处理,因此一般难以分离。普通并查集并查集支持两种操作:合并(Union):合并两个元素......
  • 并查集
    <2024.7.9>基本概念:主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作:合并(Union):把两个不相交的集合合并为一个集合。查询(Find):查询两个元素是否在同一个集合中使用步骤:初始化,假设每个人指向自己根据每个人的意向确定边的连接选出一个集合的代......