「NOI2018」冒泡排序 (施工中)

「NOI2018」冒泡排序 (施工中)

考虑冒泡排序中一个位置上的数向左移动的步数 \(Lstep\) 为左边比它大的数的个数,向右移动的步数 \(Rstep\) 为右边比它大的数的个数,如果 \(Lstep,Rstep\) 中有一个不为 \(0\) ,那么显然不会取到下界,因为产生了浪费的步数,题面给的提示在这里非常有用,如果至少有一个为 \(0\) ,那么显然没有产生浪费操作,取到下界,所以一个合法排列的充要条件就是对于所有位置 \(Lstep\times Rstep=0\) ,即该排列的最长下降子序列长度 \(\leq 2\)

先不考虑字典序的限制,只考虑求出一个合法的排列,记 \(dp_{i,j}\) 为前 \(i\) 个数,后面数中有 \(j\) 个比前 \(i\) 个数的最大值要小,此时前 \(i\) 位是一个合法排列的方案数,那么考虑这一步如果选一个小于最大值的数,一定要选最小的数,否则就会出现长度 \(>2\) 的最长下降子序列,否则可以随便选,那么 \(dp_{i,j}\) 可以转移到 \(dp_{i+1,k},j-1\leq k\leq n-i-1\) 。考虑加上字典序的限制,相当于对每一次转移到的 \(k\) 做一个下界限制,稍微改一改就得到了一个 \(\mathcal O(n^2)\) 的 80分做法,这么简单的套路去年同步赛的时候居然没想到QwQ。

看了看题解发现转格路计数是可以的,推的时候一直以为有 \(n-i-1\) 这个上界不太好搞,事实上就算爆了这个上界这样的方案最终是不能走到 \((n,0)\) 的,所以问题转化为每次横坐标 \(+1\) ,纵坐标可以选择加一个 \(\geq -1\) 的数,在超过一个下轮廓之前不能低于下轮廓,那么就枚举一下是什么时候超出下轮廓的,再转括号序列应该是可以推的吧,先睡觉去了,博客留着存个档

猜你喜欢

转载自www.cnblogs.com/mangoyang/p/11823416.html