首页 > 其他分享 >为什么会变成这样呢? #3(并查集维护区间)

为什么会变成这样呢? #3(并查集维护区间)

时间:2023-08-13 11:22:18浏览次数:35  
标签:dots 并查 复杂度 查集 区间 维护 个字符

给定长度为 \(n\) 的字符串 \(S\) 以及 \(m\) 个区间 \([l_i, r_i]\),记 \(T=S[l_1,r_1]+\cdots+S[l_m,r_m]\),其中 \(S[x,y]\) 表示从第 \(x\) 个字符到第 \(y\) 个字符的子串。求如何重新排列 \(S\) 中字符的顺序使得 \(T\) 的字典序尽可能大。

期望复杂度: 近似 \(O(n)\)。

czy's trick

在 \(S\) 中的每个位置有一个重要度,例如位置 \(l_1\) 是最重要的,应当放 \(S\) 中最大的字符,其次是 \(l_1+1,\dots,r_1,l_2,\dots\) 这些位置,且区间重复的部分以第一次出现为准。

相当于原问题变为了一个区间覆盖问题,我们只要以较快的速度跳过已经覆盖的区间即可。我们可以使用并查集维护区间,每个点对应并查集中的元素,在并查集合并的时候总是以较大的数作为父亲,则一个点的代表元就是其所在区间的右端点。

结合计数排序即可做到 \(O(n\alpha(n))\) 的时间复杂度。

例题:

标签:dots,并查,复杂度,查集,区间,维护,个字符
From: https://www.cnblogs.com/szdytom/p/how-did-we-get-here-3.html

相关文章

  • 区间半群查询与 Ackermann 函数
    最近在思考半在线卷积的复杂度有没有可能进一步优化,决定先理清类似的问题以寻求经验.一区间合并如果询问的时候不能进行半群运算,显然我们需要在预处理阶段处理所有答案,必须进行\(O(n^2)\)次计算.二区间合并如果询问的时候可以进行一次半群运算,则可以把序列每次在中......
  • 学不会的并查集
    前言又被薄纱了捏,发现没有队友啥都做不了捏,发现自己并查集忘光光捏,惨捏,感觉自己好没有用捏,捏,捏……牢骚结束,努力捏( ̄▽ ̄)*......
  • 并查集专题
    并查集专题\(AcWing\)\(836\).合并集合【最简并查集,路径压缩概念】\(AcWing\)\(837\).连通块中点的数量【并查集+附加家族成员数量】\(AcWing\)\(240\).食物链【扩展域并查集,带权并查集】\(AcWing\)\(1250\).格子游戏【普通并查集】\(AcWing\)\(1252\).搭配......
  • 并查集
    亲戚问题图论模型:每个人看作一个结点,亲戚关系看作无向边。查询时,只关心是否连通,不关心内部具体的层级关系。所以可以将各个层级直接压缩。每插入一个元素就直接向根节点合并(路径压缩)。例题:P1551|AC记录常见应用维护传递性问题例题:P3958|AC记录扩展域形式(更为......
  • 区间DP详细解析
    1.定义与性质区间类动态规划是线性动态规划的扩展,它在分阶段地划分问题时,与阶段中元素出现的顺序和由前一阶段的哪些元素合并而来有很大的关系。令状态\(dp_{(i,j)}\)表示将下标位置\(i\)到\(j\)的所有元素合并能获得的价值的最大值,那么\(dp_{(i,j)}=max\{dp_{(i,k)}+dp_......
  • 并查集处理区间跳跃
    在网上胡乱找的一些关于并查集处理区间跳跃(也有叫区间覆盖/序列联通性,这类问题有没有什么统一叫法存疑?)的题目,或许能学习后成为一种套路参考:区间跳跃问题KnightTournament板子题维护一个并查集\(nxt\),\(nxt[i]\)为从\(i\)开始(包含\(i\))的第一个没有被打败的骑士的编号并查集......
  • 「学习笔记」并查集
    真的有必要说吗?直接上封装好的模板吧,包含路径压缩和按秩合并。structunion_find_set{intfa[N],siz[N];int&operator[](constint&x){returnfa[x];}voidreset(){for(inti=1;i<=n;++i){fa[i]=i;......
  • 7999: 路径图 并查集
    描述 给定一个n个顶点(1~n编号),m条边的简单无向图,判断是否是一个路径图。路径图要求:必须存在一个顶点序列v1,v2,...,vn,它是1~n的一个排列,且对于任何1<=i<=n-1,vi和vi+1之间有边相连,而对于任何1<=i,j<=n(其中|i-j|>=2),vi和vj之间没有边相连。 输入 第一行为两个正......
  • 区间 dp
    模板区间dp一个长\(n(n\le248)\)的序列,选择数列中两个相邻且相等的元素,删去其中一个元素并使另一个元素的值\(+1\),求数次操作后数列中的最大值将这看做是合并的过程\(dp_{i,j}\)表示区间\([i,j]\)和为一个答案的取值,这里的取值其实是唯一的,所以可以之间判断对于每......
  • Codeforces 1857E:Power of Points 区间?
    1857E.PowerofPointsDescription:\(n\)个数:\(x_1,···,x_n\),从左向右扫,当\(s=x_i\)时,可以将这\(n\)个数分为若干个闭区间\([s,x_1],[s,x_2],···,[s,x_n]\)(当然如果\(x_i<s\),则区间形如\([x_i,s]\))对于每一个\(s\in(x_1,···,x_n),\)有一个整数\(p\),记\(f_......