牛客挑战赛32E 树上逆序对

nowcoder

口胡一时爽

先从这个逆序对的性质入手,手玩可以发现对于一对具有祖先关系节点的点,只有权值绝对值大的才能对这一对点是否为逆序对造成影响.具体来讲,如果祖先点权值大,并且取正号,那么其后代中所有权值更小的都会和他形成逆序对;如果后代权值更大,并取负号,那么其祖先中所有权值更小的都会和他形成逆序对;其他情况没有逆序对

所以一个点取正号,那么这个点的贡献为子树内权值更小的点个数,否则为到根链上的祖先里权值更小的点个数.前者可以二维数点,后者可以维护到根路径上的权值树状数组求出个数.现在问题变为每个点有两种权值,现在每个点都要选一种权值,每次问能不能使得权值和为\(k\).那就即\(f_{i,j}\)表示前\(i\)个点能否凑出\(j\),每次枚举下一个点,把\(f_{i,j}\)更新到\(f_{i+1,j+a_{i+1}},f_{i+1,j+b_{i+1}}\).注意到这个可以直接bitset优化

上一篇:Python中多线程编程的优点是什么?


下一篇:C++多维数组