神树和排列,2019NOI金牌营4第一题,困难的Dp

正题

      Portal

      我们考虑一个排列P,他经过一次操作之后变为F。

      很明显一个P可以得到一个F,但是F可能对应着多个P, 我们考虑怎么算出一个F对应多少个P,然后我们就可以对F进行Dp,而得出P的数量。

       有一个结论就是:F中的前缀最大值变化次数为k,那么一个F对应2^{k-1}个P

证明

       为什么?我们考虑一个不为前缀最大值的位置,它不可能从前面转移过来,只可能待在后面的位置被翻过来。

       前缀最大值变化的位置,它可能从前面转移过来,可能待在这个位置之后的一个位置等着被翻过来。

       然后我们枚举前缀最大值的(0/1)【除了第一个】,表示这个东西是从前面转移过来的还是等着别人被翻牌。

       对于每一种01序列,都对应了一种方案,1的位置就直接从待在前一个1的后面,等着前面一个1过来“撞”它就行了。

       对于第一个1,就直接待在序列中的开头就行了。

实现

       具体就是直接用f[i][j]表示前i个数最大值为j的方案数。

       假如i+1这个位置的值有钦定x,如果这个值大于最大值,那么就直接乘2转移到f[i+1][x]【乘二是因为最大值变化一次就*2】,否则就直接转移到f[i+1][j]

      接着我们看一下后面的数被钦定的值<j有a个,那么我们就乘上(j-i-a)转移到f[i+1][j],否则枚举乘上2转移到比自己大的位置上,这个操作可以用前缀和实现。

代码暂时没有,到时候补吧

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值