(这篇题解可能没什么营养,主要是记录一下我用map乱搞启发式合并的神奇做法)

首先我们知道,我们肯定要用一堆集合维护每一种数当前的位置,并支持合并和数连续出现的段数两种操作

我发现这个东西并不好搞,但是暴力维护是 \(O(n)\) 的

所以我们就要用到启发式合并

启发式合并本身是一个非常naive的trick

我们考虑我们把 \(a\) 数出现的位置集合合并到b数出现的位置集合,相当于插入每一个 \(a\) 所在的位置并更新段数

所以复杂度只与 \(a\) 数出现的位置集合的大小相关

然后我们发现把 \(a\) 合并到 \(b\) 和把 \(b\) 合并到 \(a\) 的结果是一样的

所以我们可以贪心的把小的合并到大的上

我们考虑这样操作时的均摊复杂度

我们知道所有数的位置总数是 \(n\),

然后每次把 A 集合暴力合并到 B 集合后, A 中的元素所在的集合大小起步翻倍

所以每个元素最多被转移log次

所以总的复杂度是\(O(nlogn)\)

这是启发式合并的相关内容

然后接下来就是我自己的乱搞部分啦

我们发现最简单的维护每个数出现的位置的方法是开 \(n\) 个数组

然后每个数组在改颜色出现的位置上标 1 ,其他地方标 0

但是这样开不下

当然有很多方法解决这个问题比如 vector 或者链表什么的

但是要保持这个维护写法怎么办呢

我们发现所有数组里只有 \(n\) 个位置有值,于是掏出一个神器 map !

每次转移完记得清空即可(map永远的神!)

当然set也可以qaq

//Talking to the moon
#include <bits/stdc++.h>
#define N 1000010
#define M 2000010
#define int long long
#define int_edge int to[M],val[M],nxt[M],head[N],cnt=0;
using namespace std;
int n,m,a[N],f[N],ans=0;
map<int,int>mp[N];
int read(){
int fu=1,ret=0;char ch;
for(;!isdigit(ch);ch=getchar())if(ch=='-')fu*=-1;
for(;isdigit(ch);ch=getchar())ret=(ret<<1)+(ret<<3)+ch-'0';
return ret*fu;
}
signed main()
{
n=read();m=read();
for(int i=1;i<N;i++)f[i]=i;
for(int i=1;i<=n;i++)
{
a[i]=read(),mp[a[i]][i]=1;
if(a[i-1]!=a[i])ans++;
}
while(m--){
int opt=read();
if(opt==2)printf("%lld\n",ans);
else{
int x=read(),y=read();
if(mp[f[x]].size()>mp[f[y]].size())swap(f[x],f[y]);
if(x==y||mp[f[x]].empty())continue;
for(auto i=mp[f[x]].begin();i!=mp[f[x]].end();i++)ans-=(mp[f[y]].find((*i).first+1)!=mp[f[y]].end())+(mp[f[y]].find((*i).first-1)!=mp[f[y]].end());
auto i=mp[f[x]].begin();while(i!=mp[f[x]].end())mp[f[y]][(*i).first]++,i=mp[f[x]].erase(i);
}
}
return 0;
}

洛谷 P3201 梦幻布丁 题解的更多相关文章

  1. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  2. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  3. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  4. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  7. 洛谷P3201 [HNOI2009]梦幻布丁 [链表,启发式合并]

    题目传送门 梦幻布丁 题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输 ...

  8. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

  9. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

随机推荐

  1. 微软Azure配置中心 App Configuration (一):轻松集成到Asp.Net Core

    写在前面 在日常开发中,我这边比较熟悉的配置中心有,携程Apollo,阿里Nacos(配置中心,服务治理一体) 之前文章: Asp.Net Core与携程阿波罗(Apollo)的第一次亲密接触 总体来 ...

  2. ARC120F Wine Thief (组合数学)

    题面 有一个长为 N N N 的序列,相邻的两个数中只能选一个,总共选 k k k 个数,一种方案的价值为选的 k k k 个数的和,问所有合法方案的价值总和,答案对 998244353 取模. 1 ...

  3. 第五十一篇:webpack中的loader(二) --less-loader

    好家伙 先扩充一下知识点: 什么是.less文件? 作为一名前端开发的同学,很多时候我们都无法避免地要去写大量的 CSS 代码, 而且耗费的时间还不少,所以学习一种能够提升开发效率的 CSS 预处理器 ...

  4. 踩坑 Windows 服务来宿主 .NET 程序

    本文所指的 .NET 程序为 .NET6 的程序.因为 .NET 的版本更新很快,所以方式.方法也有变化,所以网上搜到的方法有些也过时了.以下是最近我实践下来的一点心得(坑). 上一篇说到 不安装运行 ...

  5. KingbaseES的SQL语句-CTE递归

    背景 从上下级关系表中,任意一个节点数据出发,可以获得该节点的上级或下级.CTE的递归语法,或者 connect by 与 start with的 查询语法,能够实现这个需求. 当我们需要制作上下级关 ...

  6. Docker 入门指南

    Docker 入门指南 目录 基础概念 安装教程 基本操作 常用安装 构建操作 容器编排 壹.基础概念 什么是Docker? Docker是基于Go开发的应用容器引擎,属于 Linux 容器的一种封装 ...

  7. 【Elasticsearch】ES选主流程分析

    Raft协议 Raft是分布式系统中的一种共识算法,用于在集群中选举Leader管理集群.Raft协议中有以下角色: Leader(领导者):集群中的领导者,负责管理集群. Candidate(候选者 ...

  8. Windows Server体验之管理

    安装了只有命令行界面的Windows Server之后怎么去管理,对于传统的Windows管理员来说确实是比较棘手的.因为没有了图形化的管理界面,需要更多的去依赖Powershell或者cmd命令去做 ...

  9. 宝塔搭建的nginx如何只允许指定IP访问--nginx如何允许指定IP访问,nginx开发者调试模式

    我的博客,向来都是简洁.有用为主,转载请注明出处. 说白了就是往nginx配置文件中加两句话 allow 127.0.0.1; deny all; 允许127.0.0.1访问 然后拒绝其他连接,返回4 ...

  10. Jenkins 中使用 Git Parameter 插件动态获取 Git 的分支