牛客练习赛C魔法学院(hard version) 并查集加速

Posted hesorchen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客练习赛C魔法学院(hard version) 并查集加速相关的知识,希望对你有一定的参考价值。

题目

https://ac.nowcoder.com/acm/contest/11181/C

给出一个小写字母字符串,现在有m种魔法,每种魔法可以将区间LR的字母变为新字母X,求最后字符串的最大字典序。

题解思路

两种比较容易想到的操作:

  1. 将操作按照X的大小从小到大排序,每次暴力区间覆盖即可,可以使用客珂朵莉树。
  2. 将操作按照X的大小从大到小排序,相同区间覆盖一次,之后不再覆盖,可以用并查集加速跳跃过程。

并查集代码

#include <bits/stdc++.h>
using namespace std;

const int N = 1e7 + 5;

char s[N];
struct node
{
    int l, r;
    char f[2];
    bool operator<(const node &temp) const { return f[0] > temp.f[0]; }
} op[N];

int fa[N];

int find(int x)
{
    if (x == fa[x])
        return x;
    return fa[x] = find(fa[x]);
}
void solve()
{
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n + 1; i++)
        fa[i] = i;
    scanf("%s", s + 1);
    for (int i = 1; i <= m; i++)
        scanf("%d %d %s", &op[i].l, &op[i].r, op[i].f);
    sort(op + 1, op + 1 + m);
    for (int i = 1; i <= m; i++)
    {
        for (int j = op[i].l; j <= op[i].r; j = find(j + 1))
        {
            // cout << '\\t' << j << endl;
            s[j] = max(s[j], op[i].f[0]);
            fa[j] = j + 1;
        }
    }
    int ans = 0;
    for (int i = 1; i <= n; i++)
        ans += s[i];
    printf("%d\\n", ans);
}

int main()
{
    solve();
    return 0;
}

以上是关于牛客练习赛C魔法学院(hard version) 并查集加速的主要内容,如果未能解决你的问题,请参考以下文章

魔法学院(hard version)5-3

牛客练习赛85 F.音游家的谱面(Hard version)(dp的多种优化)

牛客练习赛18

转载:牛客练习赛17 c 规律题

牛客练习赛17

牛客练习赛7 购物