首页 > 其他分享 >P3201 [HNOI2009] 梦幻布丁 启发式合并,时间复杂度

P3201 [HNOI2009] 梦幻布丁 启发式合并,时间复杂度

时间:2023-09-11 17:14:04浏览次数:39  
标签:颜色 布丁 合并 P3201 区间 HNOI2009 复杂度

[HNOI2009] 梦幻布丁

一种很暴力,很容易想到,但时间复杂度不对的做法:

既然每一次修改是以颜色作为单位的,那就用set或者链表(vector)维护每一个颜色出现的位置。将颜色\(x\)改为\(y\)的时候,遍历\(list_x\)的每一个点,判断其左右是否为\(y\),更新ans(不同颜色块数量)

时间复杂度最大为 \(O(n^2)\)

合并问题,考虑“按秩合并”。

直观感觉就是每次把小区间合并到大区间上面去,这样每一次遍历 \(list_x\) 的时间就变少了。

证明如下:

每一次小区间合并到大区间,区间长度至少\(\times 2\),所以每一个点在合并时被更新的次数不会超过 \(\log n\).总时间复杂度为\(O(n \log n)\)

细节问题:

因为是按秩合并,所以可能会把题目中的\(x\)颜色变为\(y\)操作成将\(y\)合并进\(x\).

所以小区间合并到大区间的时候,大区间表示的颜色要改变。具体用一个 \(f\) 数组记录一下即可。

标签:颜色,布丁,合并,P3201,区间,HNOI2009,复杂度
From: https://www.cnblogs.com/bwartist/p/17693947.html

相关文章

  • P4729 [HNOI2009] 积木游戏
    P4729[HNOI2009]积木游戏Solution2023.09.06。八个月前做这个题调了六个小时。现在看来,除开欧拉定理的部分,整道题的思路极其清晰易懂,虽然码量大,但并不难码。尽管如此,融合了数据结构、图论(模型构建+三元环计数)、拓扑论(欧拉定理)多方面知识点,而且还有四面共角的细节问题,它仍然......
  • 梦幻布丁
    2154.梦幻布丁考虑先维护连续段数。我们可以先搞几个单链表,每个单链表存储的是每种颜色处于的所有位置,由于连续段数等于相邻两数不同的个数,我们可以先算出初始的情况,然后对于每次修改,暴力的将一种颜色的所有位置修改成另外一种颜色,这种操作一定不会使得答案增加,所以我们考虑怎......
  • 梦幻布丁 启发式合并板子
    //题意:将一段布丁染色,然后有两种操作,操作1将颜色为x的布丁全部染为y,操作2统计当前一共有多少段颜色//思路:将x染色为y可以想到启发式合并,但是注意我们交换大小集合后,有可......
  • 梦幻布丁
    梦幻布丁#include<bits/stdc++.h>usingnamespacestd;constintM=1e6+5;inta[M],now[M];intans;vector<int>g[M];voidmerge(intx,inty){for(autoi......
  • P3201 [HNOI2009] 梦幻布丁 将颜色x变成颜色y 问总共有多少种颜色 启发式合并+链表
    https://www.luogu.com.cn/problem/P3201题目描述nn 个布丁摆成一行,进行 mm 次操作。每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色。......