首页 > 其他分享 >Ural 1568

Ural 1568

时间:2022-08-13 18:11:08浏览次数:65  
标签:个点 前面 合并 1568 序列 操作 Ural rightarrow

题意:
你有一个排列\(A\),你想要用最少的操作将其排序,每次操作,你可以选择\(A\)中的一个子序列(可以不连续),将其放到前面去。
比如,\(A=\{5,1,2,4,3\}\),你可以选择子序列\(\{1,2,3\}\)放到前面,这样\(A'=\{1,2,3,5,4\}\)。

我的做法:
我们每次操作会将数组分成两个部分——放到前面的和位置不变的。
首先有一个显然的贪心,如果数\(x\)已经出现在数\((x+1)\)的前面,那么我们后续操作不会将它们放到不同的部分中了。
比如\(A=\{5,1,2,4,3\}\),那么子序列\(\{1,2,3\}\),在后面的操作中,要么同时放在前面,要么同时保持位置不变。

那么我们处理出当前的连续子序列,并将其缩成一个点,并由小到大排序,比如\(A=\{5,1,2,4,3\}\),那么划分出的子序列有\(3\)个——从小到大依次为\(\{1,2,3\},\{4\},\{5\}\)。如果当前有\(m\)个点,那么我们一次操作可以将相邻的两个点合并,由于我们可以同时合并多组点(但是一个点在一次操作只能被合并一次),所以一次操作,我们会减少\(\lfloor\frac{m}{2}\rfloor\)个点。模拟这个过程,直到\(m=1\),就将数组排好序了。

举个例子,比如样例\(2\),\(6,5,2,4,1,3\),当前有\((1),(2,3),(4),(5),(6)\)这\(m=5\)个点,第一次我们合并成\((1,2,3),(4,5),(6)\),第二次我们合并成\((1,2,3,4,5),(6)\),第三次合并成\((1,2,3,4,5,6)\),我们就排好序了。其对应的数组为\((6,5,2,4,1,3)\rightarrow (4,1,6,5,2,3)\rightarrow (1,2,3,4,6,5)\rightarrow (1,2,3,4,5,6)\)。

还有从另一个方向考虑的想法:

标签:个点,前面,合并,1568,序列,操作,Ural,rightarrow
From: https://www.cnblogs.com/Nastia/p/16583720.html

相关文章