首页 > 其他分享 >梦幻布丁

梦幻布丁

时间:2024-08-11 10:49:35浏览次数:8  
标签:元素 颜色 color 布丁 梦幻 合并 集合 复杂度

假设现在有\(n\)个元素,每个元素最开始单独成为一个集合

现在有一种合并操作,可以合并两个集合,假设将集合\(A\)合并到集合\(B\),那么时间复杂度为\(O(|A|p)\),其中\(O(p)\)表示合并一个元素的操作的复杂度,也就是说我们的操作每次是合并一个元素和一个集合,所以我们将\(A\)合并到\(B\)里,就要对\(A\)中每个元素作合并操作,于是时间复杂度为\(O(|A|p)\)

假设我们依次合并(i.e.先将\(\left\{1\right\}\)合并到\(\left\{2\right\}\),再将\(\left\{1\space2\right\}\)合并到\(\left\{3\right\}\),再将\(\left\{1\space2\space 3\right\}\)合并到\(\left\{4\right\}\),以此类推),那么不难知道时间复杂度为\(O(n^2p)\)

但是我们现在采取一个优化,每次合并都将元素个数少的集合合并到元素个数多的集合里面,这样的话时间复杂度就会变为\(O(n\log np)\)

证明:考虑每个元素对时间复杂度的贡献,为\(O(ap)\),其中\(a\)是这个元素被合并的次数,而这显然就等于其所在的不同集合的个数;考虑其所在的不同集合一共有多少个,由于每次合并是将小的集合合并到大的集合里面,那么每次小的集合的元素个数至少乘以\(2\),所以\(a\)的上界为\(O(\log n)\),于是得证

然后来考虑这道题目。注意,我们的启发式合并每次是合并一个元素的,所以我们应该考虑假设我们每次只改变一个元素的颜色(而不是所有这个元素的颜色一起改变)答案会发生什么变化

比较显然,设\(cnt\)为改变之前的答案,当前将元素\(i\)(\(i\)是下标)的颜色\(x\)改变为\(y\),那么如果\(i-1\)的颜色为\(y\),\(cnt\)会减一;如果\(i+1\)的颜色为\(y\),\(cnt\)会减一

于是我们现在就可以找到一个\(O(n^2)\)的暴力算法了,考虑用启发式合并优化

由于启发式合并会将更小的集合合并到更大的集合,涉及到集合的快速交换,所以我们需要一个散列表h[i]来表示某一种颜色的位置,并且再用一个单独的数组p[i]来表示这个颜色对应的散列表指针(这样在交换集合的时候就可以\(O(1)\)交换p了)。注意h[i]并不是表示颜色\(i\)的位置,只有p[i]才表示颜色\(i\),p[i]指向的散列表表示\(i\)的位置(p[i]不一定指向h[i]),然后剩下的可以看y总的代码;注意其代码的color数组并不是表示真实的颜色,color[i]!=color[j]只能说明位置\(i,j\)的颜色不同,但是并不表示位置\(i,j\)的颜色分别为color[i]color[j],所以交换的操作显然正确,而且交换之后ans显然不变;还要注意merge函数的参数表里面是引用

但是有一种用vector的更简单的写法。设vector<int> g[N],其中g[i]表示颜色\(i\)的位置,color的意义与y总代码相同;然后利用vecotr的成员函数swap进行高效交换(这个时间复杂度是\(O(1)\)的,原因好像是因为交换的指针)即可,代码见下

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
const ll mod=1e9+7;
int n,m;
int cnt,color[N];
vector<int> g[N];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&color[i]);
		g[color[i]].push_back(i);
		cnt+=(color[i]!=color[i-1]);
	}
	while(m--)
	{
		int op;
		scanf("%d",&op);
		if(op==1)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			if(x==y) continue;
			if(g[x].size()>g[y].size()) g[x].swap(g[y]);
			//假设颜色x的数量更多,就要交换
			//但是题目要求的是将x变成y不是将y变成x
			//所以此时认为,原来是x的位置现在全部变成y,原来是y的位置现在全部变成x
			//易知此时cnt不变 
			//然后再将此时颜色x全部变成颜色y即可 
			int v=color[g[y].back()];
			for(int i=0;i<g[x].size();i++) 
			cnt-=(color[g[x][i]-1]==v)+(color[g[x][i]+1]==v);
			while(g[x].size())
			{
				color[g[x].back()] = v;
                g[y].push_back(g[x].back());
                g[x].pop_back();
			}
		}
		else printf("%d\n",cnt);
	}
	return 0;
} 

标签:元素,颜色,color,布丁,梦幻,合并,集合,复杂度
From: https://www.cnblogs.com/dingxingdi/p/18353165

相关文章

  • 探索梦幻之旅:一场说走就走的旅游攻略!
    在这个快节奏的时代,偶尔放慢脚步,踏上一场说走就走的旅行,成为了许多人心中最温柔的向往。无论是追寻历史的足迹,还是沉浸于自然的怀抱,每一次旅行都是一次心灵的洗礼。今天,就让我们一起规划一场梦幻般的旅程,探索那些隐藏在地图角落的绝美风景与文化瑰宝。一、前期准备:细致规划,轻......
  • 【AI生图赢奖】用函数计算绘出「少年江湖」,与热播网剧梦幻联动
    在这个数字化时代,人工智能不再只是科幻小说中的幻想,创意与技术的界限正在被重新定义。摩拳擦掌研究AI的你,是否想用自己的新技术和创造力一试身手呢?阿里云联合优酷推出【少年白马醉春风·AI江湖创作大赛】,无论您是开发者、设计师、还是AI绘画爱好者,都可以使用阿里云函数计算......
  • 看透霍兰德职业测试:破解六种类型的共同特点和梦幻般的典型职业!
    简介约翰.霍兰德于1959年提出了具有广泛社会影响的人业互择理论。这一理论首先根据劳动者的心理素质和择业倾向,将劳动者划分为6种基本类型,相应的职业也划分为6种类型:社会型(Social)、企业型(Enterprising)、现实型(Realistic)、常规型(Conventional)、研究型(Investigative)、艺术型(Arti......
  • 前端JS特效第32集:jQuery空间相册梦幻效果
    jQuery空间相册梦幻效果,先来看看效果:部分核心的代码如下(全部代码在文章末尾):<!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Strict//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"><htmlxmlns="http://www.w3.org/1999/xhtml"xml:lang="en......
  • 梦幻三经脉第六版 宝端版超级技能,侵蚀系统,多开系统,新宠物,带GM后台及视频教程
    游戏简介游戏大小:5G左右支持系统:win7/10/1164位系统配套:游戏本体,GM工具+视频教程此版为梦幻三经脉第六版,是会员朋友提供的淘宝端,宠物超级技能,侵蚀系统,多开系统,新宠物等。剧情完善,游戏内多开助战,带GM工具此系列的几个版本,特色都有所不同!是收集的三经脉里比较经典的版本。......
  • 游戏工作室内部端游梦幻西游全自动挖图
    本文探讨了一种自动化技术在特定游戏环境中的应用,旨在分析其操作流程、成本效益和潜在的收益模式。1.游戏环境分析在某些在线多人角色扮演游戏(MMORPG)中,玩家可以通过探索游戏地图中的藏宝图来获取虚拟货币或其他游戏内物品。这一过程通常需要手动操作,可能涉及寻找坐标和挖......
  • EPIC Fantasy Village - Low Poly 3D Art(梦幻村庄乡村小镇模型)
    这个包提供了一个以幻想为主题的多边形风格游戏,适合TopDown、RPG、冒险、社交和RTS。它允许你创建自己的美丽幻想村庄和角色。EPIC幻想村庄包EPIC幻想村庄包提供了一个以幻想为主题的多边形风格游戏,适用于TopDown、RPG、冒险、社交和RTS游戏。这个包允许你创建自己的美丽而......
  • 【IT奇遇记】走进ITSM的奇妙世界:像打造梦幻家园一样管理企业
    想象一下,你是一位梦想家园的设计师,手中握有一把神奇的遥控器,只需轻轻一按,家中的灯光、温度、安全都自动调节到最佳状态。在企业IT的浩瀚宇宙里,也有这样一个神奇的存在——ITSM(信息技术服务管理),它就像是那把遥控器,让复杂的信息技术世界变得井井有条、生机勃勃。接下来,让我们一起乘......
  • NGUI还原梦幻西游字体效果
    最终效果步骤进入梦幻西游所在文件夹,打开font目录,拷贝华康圆体hkyt.ttf到Unity工程目录。打开FontMaker,生成对应字体asset。此时的效果如下可以看到,效果还不错,但是看着有点累。用腾讯QQ的截图软件可以对比细节。可以发现网易的字体普遍有明亮的结构。所以肯定调高了亮度。......
  • 实践指南:EdgeOne与HAI的梦幻联动
    在当今快速发展的数字时代,安全和速度已成为网络服务的基石。EdgeOne,作为腾讯云提供的边缘安全加速平台,以其全球部署的节点和强大的安全防护功能,为用户提供了稳定而高效的网络体验。而HAI(HyperApplicationInventor),腾讯云推出的高性能应用服务,通过其易用的图形化界面和丰富的模型库,......