[并查集] aw3115. 疯狂的馒头(经典并查集+离线询问+离线算法+模板)

1. 题目来源

链接:3115. 疯狂的馒头

2. 题目解析

很经典的一道并查集的应用题目,在很多地方考过,由于 lc 周赛遇到了变种题,在此总结并学习这个经典模板。

维护所有的馒头为并查集,初始每个馒头的边均指向自己。由于后染色可以将前染色覆盖掉,所以直接从后往前针对区间开始染色即可,染过的不必再染,没染的染完就确定了它的颜色,故每个点只会被染色一次。这点也是离线询问,离线算法。

并查集的根,即 find(i),操作为找到 i 右边第一个未被染色的点。当染色 [l, r] 区间时,只需要判断 find(l) 是否大于等于 r,即可判断当前区间还是否有点需要染色:

  • 若大于等于了,则说明这段均已被染色,不能再重复染了。
  • 若小于等于,则说明从 [find(l), r] 可以被染色了。令 l=find(l)l 指向这个待染色块,记录这个块的染色结果,res[l]=m。再维护并查集数组,将其指向下一个未被染色的块,即 p[i]=i+1, 也可 p[i]=find(i+1),两者是等价的,即不管 i+1,染色与否,find(i+1) 都会找到 i, i+1 右边第一个没被染色的点,只不过这个 p[i] 数组的定义可能会发生改变,在 p[i]=find(i+1) 下,存储的是右边第一个没被染色的点,但是在 p[i]=i+1 下存的不一定是下一个未被染色的点。但是我们只考虑两个集合合并之后的根,根是唯一确定的,所以这两种更新方式是相同的。

是我的个人理解,若有误,请及时指出~~~,互相学习。

  • 总是将集合合并,下一次进行查询的时候就可以跳过中间这些已经染色的块。

在此没有按秩合并,仅路径压缩的并查集时间复杂度理论上是 O ( l o g n ) O(logn) O(logn) 的,但实际运行效率为 O ( 1 ) O(1) O(1)

它可以处理 1 0 7 10^7 107 的时间复杂度,但是在输入输出上需要使用 printf、scanf


时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
空间复杂度: O ( n ) O(n) O(n)


代码:

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e6+5;

int n, m, p, q;
int fa[N], res[N];

int find(int x) {
    if (fa[x] != x) fa[x] = find(fa[x]);
    return fa[x];
}

int main() {
    scanf("%d%d%d%d", &n, &m, &p, &q);
    
    for (int i = 1; i < N; i ++ ) fa[i] = i;
    while (m) {
        int l = (m * p + q) % n + 1, r = (m * q + p) % n + 1;
        if (l > r) swap(l, r);
        while (find(l) <= r) {
            l = find(l);
            fa[l] = find(l + 1);
            // 等价 fa[l] = l + 1;
            res[l] = m;
        }
        m -- ;
    }
    for (int i = 1; i <= n; i ++ ) printf("%d\n", res[i]);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
华为安全用例基线aw库.rar是华为公司为了提升产品安全性而推出的一套安全用例基线库。该库中包含了丰富的安全用例,用于对华为产品的安全性进行评估和测试。 该库的主要作用有以下几点: 1. 提供全面的安全测试覆盖:华为安全用例基线aw库.rar中包含了多种不同类型的安全测试用例,涵盖了网络安全、数据安全、系统安全等多个方面。通过使用这些用例,可以对华为产品的各种安全风险进行评估和测试,从而确保产品的安全性。 2. 加快产品开发周期:使用华为安全用例基线aw库.rar能够帮助开发团队更早地发现和修复潜在的安全问题,从而减少产品开发过程中的安全漏洞。这样可以大大缩短产品开发周期,提高产品的上线速度。 3. 增强产品的竞争力:作为一个安全有保障的产品,可以更好地满足用户对安全性的需求,这对于提高产品的竞争力具有重要意义。华为安全用例基线aw库.rar提供了一套行之有效的安全测试用例,通过完善的安全测试流程和标准,确保产品的安全性能达到最高水平。 总之,华为安全用例基线aw库.rar是华为公司为提升产品安全性而推出的一套安全测试用例库。它对于增强产品的竞争力、加快产品开发周期以及提供全面的安全测试覆盖具有重要作用。通过使用这一库,华为公司可以更好地保障产品的安全性,提供给用户高质量的产品。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ypuyu

如果帮助到你,可以请作者喝水~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值