loj6402 校门外的树(dp,多项式求逆)

https://loj.ac/problem/6402

庆祝一下,,,第一个我自己做出来的,,,多项式的题(没办法,我太弱

虽然用了2个小时才想出来,但这毕竟是0的突破……

首先声明,虽然我写的题解很长,但是大部分都是证明和废话

 

第一步,转化题意(用时30min):

一个1~n的全排列p,如果存在i<j,p[i]<p[j],那么就把ij之间连一条边。

问所有p的所有排列方案,最后联通块的大小的乘积,的和。

因为原题中a是随机的实数,所以说我们可以不用考虑有ai=aj的情况。

因为最后用到的只有相对的大小关系,所以可以直接转化成一个1~n的排列p

其实很多时间都花在"诶,是这个意思吗,不会啊","哦,不对,看错题了"。

 

第二步,找规律推性质(用时50min):

我们发现,一个联通块,一定是lr连续的一段。

假如说,ab在同一个联通块内(令a<b),存在c满足a<c<b,并且c不在ab所在联通块内。

我们来证明这种情况是不存在的。

首先,p[b]<p[c]<p[a],否则cab有直接的边相连。

那么p[a]>p[b],但是他们在同一个联通块内,

所以一定存在一个位置x满足x<a,p[x]<p[b]或者x>b,p[x]>p[a]

那么x一定与c直接相连,所以证出矛盾。

同理,我们可以证到一个联通块的p也是连续的一段。

 

但是我不是这么找到这个性质的,因为我上面的方法只是证明了这个性质,但是如果我猜不到这个性质……

我按照套路思考,每个联通块找一个代表员好了,找谁呢,那就p最小的那个吧。

我们把点放在一个平面上,第i个点的坐标是(i,p[i])

我们按照p从小到大,加入每个点。

首先,p最小的那个点加入的时候,我们考虑找它所在的联通块的点。

找到一个满足p[j]>p[i]的最大的j,那么ij这个连续区间的所有点都在同一个联通块内。

(把这些点分成p[x]<p[j]p[x]>p[j]>p[i]两种情况讨论就可以了)

然后<i的一些点,也可能在这个联通块内。

然后我们把这些点删掉,再找到p最小的那个点,递归下去。

我们发现,我们把一个n*n的矩形,一次一次的减去一个联通块所在的"势力范围",其实是一次一次砍掉了右边的一条和下面的一条,剩下的还是一个矩形。

如图:

其中淡粉色是一个联通块的势力范围,t是这个联通块p最大的点,k是这个联通块最靠左(就是编号最小)的点。

我们再找下一个联通块的时候,下一个联通块势力范围一定是在白色部分。

所以下一个联通块的p最小的点的一定有p[x]>p[t],编号最大的点x<k

于是我们两个性质都找到啦。

 

有了这两个性质之后,我们可以发现,一个联通块[l,r],一定满足:p[l],p[l+1],....,p[r1],p[r]一定是nl+1,n(l+1)+1,....,nr+1的一个排列。

同时p[1],p[2],....,p[r]一定是n,n1,...,nr+1的一个排列。

同时[l,r1]中不存在x满足p[1],p[2],....,p[x]n,n1,....,nx+1的一个排列,否则就可以分出[l,x],[x+1,r]两个联通块了。

也就是说,如果我们称满足p[1],p[2],....,p[x]n,n1,....,nx+1的一个排列的x是好的,那么每个x都一定是一个联通块的右端点。

 

第三步,推式子(用时40min):

有了上面的几个性质,我们可以开始列dp方程了。

我们令f(n)表示1~n的一个排列,除n位置外,不存在其他位置是好的,的方案数。

那么f(0)=0,f(1)=1

f(n)=n!i=1n1i!f(ni)

g(n)=n!,特别地,我们规定g(0)=1

那么f(n)=g(n)i=1n1g(i)f(ni)

移到左边,可以得到i=0ng(i)f(ni)=g(n)

我们发现这是一个卷积形式fg+1=g。(因为f(0)=0,g(0)=1)

dp(i)表示前i个数,并且i是一个联通块右端点,的贡献。规定dp(0)=1

枚举上一个联通块的右端点,那么有:

dp(n)=i=0n(ni)f(ni)dp(i)

h(n)=nf(n)h(0)=0

dp(n)=i=0nh(ni)dp(i)

又是一个卷积形式dp=dph+1。(因为h(0)=0,dp(0)=1)

于是两次多项式求逆就可以解决问题啦。

 

 

posted @   shixinyi  阅读(380)  评论(0编辑  收藏  举报
编辑推荐:
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
阅读排行:
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 千万级的大表,如何做性能调优?
· .NET周刊【1月第1期 2025-01-05】
点击右上角即可分享
微信分享提示