[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 这么简单为什么你个傻逼股儿子做了一个上午,。