Atcoder abc323
https://atcoder.jp/contests/abc323
G - Inversion of Tree
给定一个 1~n的排列p
1 | for k = 0..n-1: |
n 500
4s
1024mb
我的思路
因为这里要的相反不是 父子和p相反,而是index
和p[index]
相反, 所以如果要选根,选1就行
然后问题是 如果在树上做dp,不光要记录满足树和子树的点树,还需要记录哪些点已经用了,感觉这状态有点多
注意到$n\le 500$是有点小的,可能有$n^2,n^3$的考虑的方向,但实际上这里还有一个k,所以可能是$nk,n^2k,nk^2$一类的
但直接的思路还是没有
然后就是插入新点的想法
如果有一个n-1点的方案,那么对于 p[1]...p[n-1]
需要把所有大于$p[n]$的p进行减1,这样就是规模减1的子问题,
但是问题是,这样的话,并没有看出n-1到n的转移
首先钦定了根是1,所以(n,p(n))不是根,如果它是叶子,那么 一个n-1树上原来叶子p[叶] >= p[n]
都会贡献到对应的k+1, 而原来p[叶] < p[n]
会贡献到k
那还不用说非叶子的,光是这里,就需要记录叶子的p和更大的p之间的关系的个数,那么更小的层数时要记的关联太多了
似乎连一个暴力的计数法都没有
然后 如果 == k难求,可以考虑求 $\le k$ 然后做相邻相减