正题
我们考虑一个排列P,他经过一次操作之后变为F。
很明显一个P可以得到一个F,但是F可能对应着多个P, 我们考虑怎么算出一个F对应多少个P,然后我们就可以对F进行Dp,而得出P的数量。
有一个结论就是:F中的前缀最大值变化次数为k,那么一个F对应个P
证明
为什么?我们考虑一个不为前缀最大值的位置,它不可能从前面转移过来,只可能待在后面的位置被翻过来。
前缀最大值变化的位置,它可能从前面转移过来,可能待在这个位置之后的一个位置等着被翻过来。
然后我们枚举前缀最大值的(0/1)【除了第一个】,表示这个东西是从前面转移过来的还是等着别人被翻牌。
对于每一种01序列,都对应了一种方案,1的位置就直接从待在前一个1的后面,等着前面一个1过来“撞”它就行了。
对于第一个1,就直接待在序列中的开头就行了。
实现
具体就是直接用表示前i个数最大值为j的方案数。
假如i+1这个位置的值有钦定x,如果这个值大于最大值,那么就直接乘2转移到【乘二是因为最大值变化一次就*2】,否则就直接转移到
接着我们看一下后面的数被钦定的值<j有a个,那么我们就乘上转移到,否则枚举乘上2转移到比自己大的位置上,这个操作可以用前缀和实现。
代码暂时没有,到时候补吧