T1
主席树做一下就行了,好像被标算暴踩
T2
这题目有个比较妙的性质:交换的时候只是这个段之内进行交换,并不影响段之间的逆序对
那么不难得到直接维护每个区间长度的逆序对总数
在交换的时候直接翻顺序对为逆序对即可
我们发现这里的序列的区间长得很像线段树,也可以想成用归并的形式来求解
所以代码实现稍微有点细节,需要先减掉相等情况下的数目
T3
先把题目转化出来,每次删掉一个数,剩下的数的所有方案 (sum) 肯定不变
然后如果把这个数换成剩下的和加上 (1) ,那么得到了 (2sum+1) 种方案
所以我们求这个剩下的数的最多方案就行了
因为值域比较小,可以 (bitset)
然后考虑直接输出剩下的数的和是不能过对拍的,那么考虑这个换成的数应该是什么
如果有一个数加上任意个其它的数不会造成重复,那么这样的数的最小值就是答案,上面的和加一符合
这样的数 (x) 一定不可以被表示成两个无交的集合的和的差
那么直接 (bitset) 左移右移做就行了
T4
记 (d_x) 为 (x) 最近的点距离 (x) 的距离,那么有几个性质:
如果 (d_xle d_{fa_x}) 那么会考虑在 (fa_x) 处放
然后考虑记 (f_x) 表示深度最浅的羊是不是被保护和 (g_x) 子树里面远能保护的点
然后考虑转移,先统计上来 (g_x),这样就可以处理跨子树保护的问题
然后再考虑儿子的 (d) 和根的 (d) ,如果大于就在儿子那里放个牧羊人
很厉害的题目,现在的能力确实想不出来,性质挺深刻的