首页 > 其他分享 >梦幻布丁 启发式合并板子

梦幻布丁 启发式合并板子

时间:2022-12-23 17:15:16浏览次数:42  
标签:int 布丁 合并 pos 板子 集合 启发式 col

//题意:将一段布丁染色,然后有两种操作,操作1将颜色为x的布丁全部染为y,操作2统计当前一共有多少段颜色
//思路:将x染色为y可以想到启发式合并,但是注意我们交换大小集合后,有可能最后合并本来应该剩下y集合的,但是却剩下了x集合
//      好在答案与你到底是x还是y无关(只统计颜色段数),只需要在叫到y的时候,将x(或y)合并到另一种颜色就好
#include<bits/stdc++.h>
using namespace std;
const int N = 101000;
const int M = 1010000;
vector<int> pos[M];
int n, m, a[N], ans;
void modify(int p, int col) {
        ans -= (a[p] != a[p - 1]) + (a[p] != a[p + 1]);
    a[p] = col;
        ans += (a[p] != a[p - 1]) + (a[p] != a[p + 1]);
}
int main() {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        pos[a[i]].push_back(i);//将每个位置归类进每个颜色集合
    }
    for (int i = 1; i <= n + 1; i++) ans += a[i] != a[i - 1];//统计不同颜色段数,因为算上了a[0],
                                                         //所以最终ans应该-1
    for (int i = 0; i < m; i++) {
        int op; scanf("%d", &op);
        if (op == 2) printf("%d\n", ans - 1);
        else {
            int x, y;
            scanf("%d%d", &x, &y);
            if (x == y) continue;
            if (pos[x].size() > pos[y].size()) swap(pos[x], pos[y]);//保证x为小集合,最后合并剩下到的集合一定是y
            
            if (pos[y].empty()) continue;
            int col = a[pos[y][0]];//查询集合y中的实际颜色

            for (int p : pos[x]) {
                modify(p, col);//因为pos[y]集合中的点颜色不一定是y,所以需要单独修改
                pos[y].push_back(p);//集合合并
            }
                
            pos[x].clear();

        }
    }
}

 

标签:int,布丁,合并,pos,板子,集合,启发式,col
From: https://www.cnblogs.com/Aacaod/p/17001089.html

相关文章

  • 树上启发式合并
    树上问题都是神仙又称\(DSUontree\)前置芝士会重链剖分的思想(就是只会口胡就行)适用范围:我也不知道理论就是对每个结点,暴力统计其子树内的信息只不过在每个结点......
  • 梦幻布丁
    梦幻布丁#include<bits/stdc++.h>usingnamespacestd;constintM=1e6+5;inta[M],now[M];intans;vector<int>g[M];voidmerge(intx,inty){for(autoi......
  • ☆ 启发式 ☆ 合并! ☆ 分裂! ☆
    我不知道为啥要起这个标题。启发式合并就是一个思想,把小的往大里合。感性理解,就是每次合并一定会使集合大小翻倍,于是复杂度仅多一个\(\log\)。树上启发式合并难维护的......
  • 洛谷P3224 [HNOI2012]永无乡 题解 splay tree 启发式合并
    题目链接:https://www.luogu.com.cn/problem/P3224主要知识点是:树上启发式合并,即每次合并将小的树里面的每个点合并大大的树里面,时间复杂度\(O(n\log^2n)\)。同时需要......
  • windows上运行qemu仿真stm32板子a9板子实例
    由于网上的教程大部分都是基于Linux系统搞的,其实从初学者的易用性来说,这是不方便的,因为我们还得装个虚拟机,还得装个Ubuntu,还得配一些环境,甚至还得命令行编译出来,很繁琐的,中......
  • 尝试把多项式板子分段喂给 ChatGPT 辨认
    #include<bits/stdc++.h>#defineendl'\n'#definerep(i,a,b)for(inti=(a);i<=(b);++i)#defineRep(i,a,b)for(inti=(a);i>=(b);--i)usingnamespacestd;const......
  • IAR生成的HEX、bin文件用DownLoader_MINI打不开,下载不到板子上
    一开始,我是这样配置IAR->option的,让他生成hex\bin文件:第1)步:第2)步:   但这个样子通过编译生成的hex文件打开是乱码,而且用DownLoader打不开:     后来百......
  • 一本通1456(哈希表板子
     用map<int,bool> #include"bits/stdc++.h"usingnamespacestd;constintN=1e4+5;#defineintunsignedlonglongconstintmod=212370440130137957ll;cha......
  • splay板子
    #include<bits/stdc++.h>usingnamespacestd;constintmaxn=100000+5;structSplay{intch[maxn][0],ch[maxn][1],fa[maxn],siz[maxn],key[maxn],tot;......
  • lca 板子
    这题#10130. 「一本通4.4例1」点的距离求树上两点的距离 #include<bits/stdc++.h>usingnamespacestd;constintN=1e6+2,M=N;intnxt[M],hd[N],all,go[M......