首页 > 其他分享 >Solution Set - 训练计划 链表

Solution Set - 训练计划 链表

时间:2024-01-31 22:23:30浏览次数:25  
标签:nxt head Set int siz Solution 链表 fa

咕掉了两道不可做题(指黑色)。

梦幻布丁

放在链表的题单里,和链表有什么关系呢???

因为都是在对颜色整体进行操作,我们可以根据颜色拉出来对应的链表。

那么每次合并就相当于把一个链表接到另一个链表上去,暴力修改,那么是 \(O(n)\) 的,但是要怎么维护答案呢?

首先可以处理出不做任何操作时的答案 \(ans\)。那么假设每次将颜色 \(x\) 更改为 \(y\),变化量就是 \(\sum\limits_{c_i = x} [c_{i - 1} = y] + [c_{i + 1} = y]\),减去就好了。

但是你看,这一次 \(O(n)\) 不直接飞起?引入一个非常 NB 的东西:启发式合并。就是每次小的接到大的上面去,时间复杂度不会证,但类似并查集的启发式合并,均摊下来是 \(O(\log n)\) 的。这样就完了。

以及说一个维护的细节,类似于链式前向星那样,记录 \(head, nxt\),接就把 \(head\) 接上去就好了。这里记录 \(ed\) 没啥用,因为遍历需要从 \(head\) 开始。

namespace liuzimingc {
const int N = 1e6 + 5;

int n, m, a[N], ed[N], nxt[N], head[N], siz[N], ans, fa[N];

void merge(int x, int y) {
    for (int i = head[x]; i; i = nxt[i]) ans -= (a[i - 1] == y) + (a[i + 1] == y);
    for (int i = head[x]; i; i = nxt[i]) a[i] = y;
    nxt[ed[x]] = head[y];
    head[y] = head[x];
    siz[y] += siz[x];
    head[x] = ed[x] = siz[x] = 0;
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        fa[a[i]] = a[i];
        if (!siz[a[i]]) ed[a[i]] = i; // 链表的最末端 
        siz[a[i]]++;
        nxt[i] = head[a[i]];
        head[a[i]] = i;
        ans += a[i] != a[i - 1];
    }
    while (m--) {
        int op, x, y;
        cin >> op;
        if (op == 1) {
            cin >> x >> y;
            if (x == y) continue;
            if (siz[fa[x]] > siz[fa[y]]) swap(fa[x], fa[y]);
            if (!siz[fa[x]]) continue;
            merge(fa[x], fa[y]);
        }
        else cout << ans << endl;
    }
	return 0;
}
} // namespace liuzimingc

标签:nxt,head,Set,int,siz,Solution,链表,fa
From: https://www.cnblogs.com/liuzimingc/p/18000261/list

相关文章

  • CF1796C Maximum Set
    原题传送门当天比赛打完之后看了看跟我排名差不多的人的这题代码,感觉莫名其妙,写了几十行。我看了看我只有十几行的AC代码,陷入了沉思。分析题目的要求其实可以转换为:在区间\([l_0,r]\)中选择一些数,使得这些数排序后每个数都是前一个数的倍数,要求选的尽可能多。那既然要选的......
  • ABC306F Merge Sets
    原题链接分析观察要求的式子:\(\sum_{1\leqi\ltj\leqN}f(S_i,S_j)\),发现可以拆成每一个集合\(S_i\)的贡献的和。那么我们考虑每一个集合\(S_i\)的贡献。显然,对于每一个\(S_i\),其贡献就是\(\sum_{i\ltj\leqN}f(S_i,S_j)\),也就是它与其后每一个集合\(S_j\)的......
  • 节点与链表
    classListNode:def__init__(self,val=0,next=None):self.val=valself.next=nextclassSingleLinkList:def__init__(self,node=None):self.__head=nodedefis_empty(self):'''判断列表是否为空'&#......
  • Solution - Median Sum
    其它题不是很写得动了跑来写一下这个题,还是挺有趣的。给定由\(n\)个正整数\(a_1,a_2,\dots,a_n\)组成的可重集合,求出它的非空子集的和的中位数。设\(sum=\sum\limits_{i=1}^na_i\)。首先是对于任意一个子集,设其和为\(x\),我们将其取反,就是选的改成不选,不选的改......
  • vue3-setup中如何通过ref调用子组件的函数
    vue3-setup中如何通过ref调用子组件的函数子组件通过defineExpose向外导出需要调用的函数在父子间中定义ref引用来调用子组件关键代码:<scriptsetup>import{ref,reactive,defineExpose}from'vue'constshow=ref(false);consttitle=ref('添加收款方式');con......
  • Debug: ERROR: Directory '*py3-none-any.whl' is not installable. Neither 'setup.
    [ERROR:Directory'*py3-none-any.whl'isnotinstallable.Neither'setup.py'nor'pyproject.toml'found.]kubectllgostrainer-pod-name-nkubeflow-->,pipeline_info=id:"detect_anomolies_on_wafer_tfdv_schema"......
  • android setprop getprop, 调整app heap 堆 大小
    网上的截图: 通过setprop设置的更改的属性,重启之后就会消失。 调整app堆大小。      一些基本的了解。  ......
  • 代码随想录算法训练营第三天 |203.移除链表元素 , 707.设计链表,206.反转链表
    206.反转链表 已解答简单 相关标签相关企业 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1:输入:head=[1,2,3,4,5]输出:[5,4,3,2,1]示例2:输入:head=[1,2]输出:[2,1]示例3:输入:head=[]输出:[] 提示:链......
  • QSplitter 分割 组件之setStretchFactor方法
    原型:voidQSplitter::setStretchFactor(intindex,intstretch)翻译:将索引位置的部件的大小策略更新为具有拉伸因子stretch。stretch不是实际的拉伸因子;实际的拉伸因子是通过将部件的初始大小乘以stretch来计算的。根据实际情况可知,如果俩个控件默认大小一样,若下标0的拉伸因......
  • modset.c
    / DRM双缓冲垂直同步模式设置方法 这个例子扩展了modeset-double-buffered.c,并引入了与垂直空格(vsync'ed)同步的页面翻转。垂直空白是显示控制器从扫描帧缓冲区中暂停的时间。垂直空白结束后,将逐行再次扫描framebuffer,并在后面跟着垂直空白。 在更改framebuffer时,垂直空格是......