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

阅读: 评论:0

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

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

题目

给出一个小写字母字符串,现在有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("%dn", ans);
}int main()
{solve();return 0;
}

本文发布于:2024-02-05 09:22:55,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170728637665265.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:练习赛   学院   魔法   version   hard
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23