枚举根
可以把每个点抽象成从这个点到根路径上的点全部+1,规则改为两个点可以消去。
不同子树显然不属于同一个集合。
我们可以进行操作。
对于一个点来说。
相当于给予一个(a)数组。
求最终剩下的个数和消去的次数。
那么分(sum-a_{max}>=a_{max})和(sum-a_{max}<a_{max})进行讨论即可(dp)出当前根的答案。
我们可以发现答案是这种形式。
可以转化为大于等于某个数出现次数的计数。
直接数位(dp)就可以。
构造子序列自动机。
考虑状态((S,T))表示(S)后面接上一个串(T)的子序列。
这张图是(DAG)。
建图之后考虑对于每一个串计数这个串是多少个串的子序列。
求出字典序最小的满足条件的即可。
对于每一个位置取最小限制。
然后转化成多个限制中必须至少有一个取最大值的。
那我们处理出每一个点最靠左的最大值的位置是(L[i])。
然后设(dp[i][j])为前(i)个点,最后一个满足最大值的(j)的方案。
就可以直接(dp)了。
分区间考虑
设(dp[i][j][k])为区间([i,j])的最小值为(k)的最大收益。
然后和区间一样枚举最小值的位置转移就可以了。
这就是笛卡尔树(dp),每次枚举的位置两侧的最小值一定要大于当前位置。
根据(H)建出笛卡尔树。
相当于每次消掉最下一层的节点。
设(dp[i][j])为当前节点(i)的子树里面选了(j)个车的方案。
剩下的列必然只有(sz[i]-j)个。
行的范围就是当前表示的矩形。
我们考虑从前向后决定元素。
那么可以确定第(i)个元素在前(i)个元素的相对大小来使得逆序对的增加量恰好为([0,i-1])。
枚举(j)是(i)的祖先,从(i)向(j)的方向和(i)向(j)的方向分别确定每个元素在当前排列中的相对大小。
可以发现此时除了这一对(i,j)外。
其他点的贡献都是([0,k-1]),(dp)的时候先假设(i,j)的贡献也是([0,i-1]),然后撤销掉这一贡献即可。
设(f[i][j])表示(S)的前(i)位和(T)的前(j)位匹配的最长长度。
那么我们设(dp[i][S])表示(S)的前(i)位中,(f[i])的具体差分情况为(S)的方案。
因为(0leq f[i][j]-f[i][j-1]leq 1),所以差分可以用二进制表示。
这就是(dp)套(dp)。
假设我们要求的(and)值为(w)。
那么我们可以设(dp[i][a][b][c][d])表示前(i)位中(x)和(y)分别与(L_x),(R_x),(L_y),(R_y)的关系的(w)二元组对数。
然后把(a,b,c,d)压在一起。
变成(dp[i][S])即可。
假设已经知道了格子的颜色可以用插头(dp)判断是否可行。
即(f[S])为轮廓线上匹配状态为(S)是否可行。
那么我们套一个(dp)上来。
为(dp)到((i,j))这个格子轮廓线上的颜色为(C),(f)的结果为(S)的方案数。
仍然设(dp[i][k])为前(i)位,选了(k)段的最优值。
然后显然可以用决策单调性整体二分优化决策转移。
分治的时候用类似莫队的方法搞出每一块的贡献即可。
复杂度还是(O(nklogn))