「Solution Set」06/07
P6109 [Ynoi2009] rprmq1
矩形加,矩形求和。但是修改都在查询前面。
trick:如果是矩形加并且没有时间的区别,可以将以为当作时间。相当于在一段时间内将序列的一段区间加。
然后可以转化为在序列的一段先加上,过一会再减掉。
查询可以看作在一段时间上所有时刻的区间最大值。可以转化为历史最大值。
我们考虑猫树分治。首先求出在 mid 上的初始状态,往左回退修改,往前加上修改,就分开求两部分的历史最大值。
其实求出初始状态只需要加入修改,然后加一个 tag
就行。
SPOJ PERIODNI - Periodni
笛卡尔树。
先建出来笛卡尔树,然后直接树形 DP 就行。
树形 DP 就设 \(f_{i,j}\) 以 \(i\) 为根的子树已经占上了 \(j\) 列的方案数。
CF1408G Clusterization Counting
组间连边都大于组内连边
trick:我们把边排序,从小到大加入图,发现如果一个联通块任意两点都有连边,那么这个联通块一定是个可以的团。而且只有这样是可以的(不用证明吧)
然后我们发现直接做不好做,但是如果建一棵克鲁斯卡尔重构树,一个节点代表一个联通块。
那么如果节点里面的边的数量是 \(\frac {n(n-1)}2\),他就可以是一组。
然后节点代表的点的范围是区间,所以可以把所有节点找出来 DP 了。
CF1422F Boring Queries
我们先考虑离线询问,发现按右端点排序,这个数能产生的最小公倍数。
然后考虑消掉之前的贡献,我们可以只要有一个质数 \(p\),就在上一个出现同等数量的 \(p\) 位置除掉 \(p\),这样包括 \(i\) 的时候和上一次以及之前的都不会算重了。
于是我们考虑主席树维护刚才的线段树,就能在线了。