AcWing 2154. 梦幻布丁

#include<bits/stdc++.h>using namespace std;//N 表示的是有多少个布丁
//M 表示的是有多少种颜色
const int N=1e5+10,M=1e6+10;//h e ne idx 是链表的组成元素
//表示的是有 M 个颜色,每一个颜色下面连着一个单链表
int h[M],e[N],ne[N],idx;
//n 表示元素个数,m 表示操作次数,ans 表示连续的
//不同颜色的段数
int n,m,ans;
//color 用来存每一个布丁的颜色
//p 用来存映射关系,意思是说,颜色对应的本来是该颜色
//本身,但是由于特殊需要,需要把颜色映射为另一个颜色
//特殊需要是指,我们需要把数目少的颜色的集合合并到
//数目多的颜色的集合中去,但是有可能需要变成的颜色的
//数目是少的集合,此时需要修改映射
//sz 表示的是,颜色的出现次数
int color[N],p[M],sz[M];//单链表的添加操作,表示的是
//把一个数字添加到该颜色往下的一个单链表中
//添加的时候顺便把颜色出现的次数更新
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;sz[a]++;
}//合并两个集合,因为每一次合并都是把小的集合
//合并到大的集合中去,假设小的集合的大小是 x
//合并完成之后,集合的大小至少是 2x
//从而可以把 O(n) 的时间复杂度降到 O(logn)
//需要进行修改操作,需要需要加上引用符号
void merge(int& x,int& y)
{//被操作元素的颜色和需要变成的颜色相等,不需要进行操作if(x==y)return;//被操作颜色的大小更大,需要把两个颜色进行交换//这里交换的是两个映射的数值//比如说原来的 p[x]=1,p[y]=2//sz[x]=10 sz[y]=1//交换之后,p[x]=2,p[y]=1//注意后面的 x,y 表示的都是 p[x] p[y]//交换两个元素,表示把颜色出现次数少的集合//添加到颜色出现次数多的集合后面if(sz[x]>sz[y])swap(x,y);//遍历 x 所在的单链表//~i 等价于 i!=-1//因为 ~(-1)=0for(int i=h[x];~i;i=ne[i]){int j=e[i];//更新答案,假设修改之后的颜色和前一段的颜色相等//答案减小 1 ,假设和后一段颜色相等,答案也减小 1//下面是一种比较简短的写法ans-=(color[j-1]==y)+(color[j+1]==y);}//遍历 x 所在的单链表for(int i=h[x];~i;i=ne[i]){//更新颜色int j=e[i];color[j]=y;//把尾结点指向另一个单链表的头节点if(ne[i]==-1){ne[i]=h[y];//另一个单链表表示的是元素更多的集合//假设不是,前面已经交换过了,所以一定是//元素多的集合的头节点指向当前链表的头节点h[y]=h[x];//把当前链表的头节点初始化为 -1//表示空h[x]=-1;//结束循环break;}}//更新集合的大小sz[y]+=sz[x];//清空小的集合sz[x]=0;
}int main()
{//初始化头节点memset(h,-1,sizeof h);cin>>n>>m;for(int i=1;i<=n;i++){cin>>color[i];//初始化答案if(color[i]!=color[i-1])ans++;//把点添加到单链表中,相当于一条单链表上面挂了//很多单链表add(color[i],i);}//初始化映射,开始是什么颜色就对应什么映射//映射的作用是支持修改for(int i=0;i<M;i++)p[i]=i;while(m--){int op;cin>>op;//输出答案if(op==2)cout<<ans<<endl;else{// x 表示待修改的颜色//y 表示修改之后的颜色int x,y;cin>>x>>y;//p[x] p[y] 表示的是映射的颜色//p 其实是取指针的意思,表示指向的颜色merge(p[x],p[y]);}}return 0;
}

启发式合并

表示的意思是,把元素少的集合合并到元素多的集合中,这样可以使得时间复杂度降低到 log

该题最难的地方在于,假设我们要把一个元素多的颜色修改为一个元素少的颜色,怎么实现上面的要求

解决方案是弄一个指针数组,或者说映射数组,把颜色交换,保证每一次操作都是把出现次数少的颜色修改为出现次数多的颜色

修改头结点和尾结点从而实现合并,等号前面的结点表示从该节点出发,等号右边的结点表示该点是终点,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/731639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

02、进程的基础

1.进程的概念 进程&#xff08;Process&#xff09;是计算机中的程序关于某数据集合上的一次运行活动&#xff0c; 是系统进行资源分配的基本单位&#xff0c;是操作系统结构的基础。在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b;在当代…

【数仓】Maxwell软件安装及配置,采集mysql数据

相关文章 【数仓】基本概念、知识普及、核心技术【数仓】数据分层概念以及相关逻辑【数仓】Hadoop软件安装及使用&#xff08;集群配置&#xff09;【数仓】Hadoop集群配置常用参数说明【数仓】zookeeper软件安装及集群配置【数仓】kafka软件安装及集群配置【数仓】flume软件安…

LeNet5实战——衣服分类

搭建模型训练代码&#xff08;数据处理、模型训练、性能指标&#xff09;——> 产生权重w ——>模型结构c、w测试 配置环境 Pycharm刚配置的环境找不到了-CSDN博客 model.py 导入库 import torch from torch import nn from torchsummary import summary 模型搭…

河北省光伏展

光伏展是指光伏行业的展览会&#xff0c;也被称为太阳能展。光伏展一般是由光伏企业、科研机构、行业协会和专业展览公司等共同举办的。展会内容包括光伏产品、技术、设备、材料、应用等方面的展示和交流。 光伏展通常是光伏行业的重要盛事&#xff0c;吸引了全球范围内的光伏企…

npm镜像源地址

镜像源地址替换问题&#xff08;重要&#xff09; 2024 年 1 月 22 日 &#xff0c;registry.npm.taobao.org 的 SSL 证书正式过期。 2022 年 5 月 淘宝源发布了公告&#xff1a; &#xff08;大家应该没有太多关注哦&#xff0c;也包括我&#xff0c;哈哈&#xff09; &am…

144.乐理基础-根三五音、大三和弦、小三和弦

内容参考于&#xff1a; 三分钟音乐社 上一个内容&#xff1a;143.乐理基础-和弦是什么&#xff1f;和声是什么&#xff1f;三和弦-CSDN博客 必须先看上一个内容&#xff0c;了解什么是和弦、什么是和声&#xff0c;以及三和弦的定义 上一个内容最后写了三和弦的定义&#x…

【C++ 学习】构造函数详解!!!

1. 类的6个默认成员函数的引入 ① 如果一个类中什么成员都没有&#xff0c;简称为空类。 ② 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 ③ 默认成员函数&#xff1a;用户没有显式实现&…

嵌入式学习第二十五天!(网络的概念、UDP编程)

网络&#xff1a; 可以用来&#xff1a;数据传输、数据共享 1. 网络协议模型&#xff1a; 1. OSI协议模型&#xff1a; 应用层实际收发的数据表示层发送的数据是否加密会话层是否建立会话连接传输层数据传输的方式&#xff08;数据包&#xff0c;流式&#xff09;网络层数据的…

基于YOLOv8深度学习的智能道路裂缝检测与分析系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测、目标分割

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

外包干了5天,技术退步明显。。。。。

在湖南的一个安静角落&#xff0c;我&#xff0c;一个普通的大专生&#xff0c;开始了我的软件测试之旅。四年的外包生涯&#xff0c;让我在舒适区里逐渐失去了锐气&#xff0c;技术停滞不前&#xff0c;仿佛被时间遗忘。然而&#xff0c;生活的转机总是在不经意间降临。 与女…

家庭关怀视角下对待患病亲人态度的重要性——评析母对病父大声呵斥的行为现象

在家庭生活中&#xff0c;尤其是面对家人身体不适或疾病困扰的时候&#xff0c;我们的态度和行为方式显得尤为重要。近期&#xff0c;社会上存在一种令人忧虑的现象&#xff0c;即某些家庭中&#xff0c;母亲因压力或其他原因对生病的父亲表现出不耐烦甚至大吼大叫的态度。这种…

警用移动执法远程视频监控方案:安防视频监控系统EasyCVR+4G/5G移动执法仪

一、背景需求 在现代城市管理中&#xff0c;移动执法仪视频监控方案正逐渐成为一种高效、便捷的管理工具。该方案通过结合移动执法仪和视频监控技术&#xff0c;实现了对城市管理现场的实时监控和取证&#xff0c;有效提升了城市管理水平和效率。 移动执法仪作为现场执法的重…

TypeScript 哲学 - Object Types

readonly 修饰对象和数组的 双向可分配性是不同的 只有有一个可选属性不是意味着必须 不能传空对象&#xff0c;&#xff1a;这个例子&#xff08;两个属性可选&#xff09;而是如果对象有额外属性&#xff0c;那么必须至少加一个 可选属性。只要你在传递的值和目标类型有一个…

大模型概念解析 | Prompt Engineering

注1:本文系"概念解析"系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:大模型中的Prompt Engineering 大模型概念解析 | Prompt Engineering 第一部分 通俗解释 在人工智能的世界里,有一群被称为大模型的巨无霸。它们就像是知识的海绵…

关于STM32G070RBTx单片机使用HAL库往flash写数据的过程中死机问题

1.单片机型号:STM32G070RBTx 2.出现的问题 根据库函数FLASH_If_Write()的使用&#xff0c;我们分析往flash写数据的过程是把uint8_t 类型的数据(p_data)以地址的形式强转成uint64类型的&#xff0c;在一包128字节的数据时一次存储8位&#xff0c;存16次(packet_size/8)&#x…

Java项目:基于SSM框架实现的二手车交易平台【源码+开题报告+任务书+毕业论文+答辩ppt】

一、项目简介 本项目是一套基于SSM框架实现的二手车交易平台 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功能齐…

MySQL底层原理

1. 请解释MySQL的逻辑架构和物理架构。 MySQL的逻辑架构和物理架构涉及到多个层面&#xff0c;包括网络连接、服务处理、存储引擎以及数据存储等部分。具体如下&#xff1a; 逻辑架构&#xff1a; 连接层&#xff08;Connection Layer&#xff09;&#xff1a;客户端通过TCP…

瑞芯微 | I2S-音频基础 -1

最近调试音频驱动&#xff0c;顺便整理学习了一下i2s、alsa相关知识&#xff0c;整理成了几篇文章&#xff0c;后续会陆续更新。 喜欢嵌入式、Li怒晓得老铁可以关注一口君账号。 1. 音频常用术语 名称含义ADC&#xff08;Analog to Digit Conversion&#xff09;模拟信号转换…

Android中Fragment的onResume方法的介绍、执行时机,以及不执行回调的异常情况分析

onResume()是Fragment生命周期中的一个重要方法&#xff0c;表示Fragment已经获取焦点并开始与用户交互。在onResume()方法中&#xff0c;Fragment通常完成与用户界面交互的准备工作&#xff0c;比如开始执行一些动画、加载数据或注册监听器等。 1. 回调时机&#xff1a; onRe…

stm32普通定时器脉冲计数(发送固定脉冲个数),控制步进电机驱动器

拨码开关设置驱动器&#xff0c;细分 方法思路&#xff1a;用通用定时器TIM2&#xff0c;1ms产生一次中断&#xff1b;在中断里做IO反转&#xff1b; 发送10个脉冲信号