[NOI2009] 二叉查找树 | CF840C On the Bench

这个题:二叉搜索树原理认识 + 区间dp;只要熟练相关算法就一定可以做出来。但我不行。。。

我们学习一下笛卡尔树:

什么垃圾东西,不学了。

发现这个题是 l 蓝书上一道题 jqb。

二叉查找树又有一个性质:二叉查找树的中序遍历是其代表的序列从小到大排序的结果。

而无论Treap如何旋转,其都是一棵二叉查找树,因此,无论我们怎么改变数的权值,这棵树的中序遍历还是不会变的。

所以假设 \(dp(l,r,x)\) 区间 \([l,r]\),所有数的权值 >= \(x\) 的权值。

考虑二叉搜索树是怎么做区间 dp 的,枚举当前的根节点,然后加上的权值是当前区间 sum,表示新增的深度 1 * 权值。

复杂度 \(O(n^4)\)

发现自己的理解并不好。

这个中序遍历的前提是这个排序值在序列中是递增的,所以先排一轮序。


这个经典的容斥了:总方案数减去(至少有一个为平方数)。而后面的东西是 \(\sum (-1)^{i+1} f(n,i)\)

但是发现关于 \(i\) 选的数,你无法判断他前面选过没有,就会导致重复。

发现:一个数能够成平方数关系的所有数都是互相满足条件的,而其它一定独立,所以常见的,我们把这些东西缩成一个,每次 dp 考虑这一群就好了。

我他妈的真的破防了。

设计得简单一点会死吗。https://blog.csdn.net/can919/article/details/80154917 为什么不想这项写。

\(f(i,j)\) 表示分成 j 段的方案数。

考虑将 i 组分成 j 段,首先所有球的排列为 \(b_i!\)

然后又使得块内无需,初一 \(j!\)。(块的顺序最后考虑)

然后考虑分成 j 段,插板法即可。

最后容斥即可,ctmd 这么简单为什么你个傻逼股儿子做了一个上午,。

posted @ 2024-05-11 22:29  LCat90  阅读(5)  评论(0编辑  收藏  举报