时间安排
8:10–8:30 读题,T1是个找结论的题,T2貌似可以树上背包,T3数据结构。
8:30–9:00 T1,手玩小数据,对于已知两维,可以推知大概的上下界,问题在于哪些值能取到,猜了几个结论发现对不上打表。
9:00–9:30 T2,貌似对于部分分可以容斥做,但是复杂度比较大貌似推广不到正解。
9:30–10:30 T3,用异或判重的套路可以做到 n^2 拿到 25 分。发现答案的重复主要是因为一些极长的重复的段,考虑能不能把这些段找出来然后计算答案,发现不太会做。
10:30–11:40 T2,考虑容斥的做法,写完发现输出不对,于是决定直接正着做,可以有一个 n^2 的 dp ,拿到 40 分。可是这样 D<=20 的点就拿不到了。但是不知道有什么更能拓展的 dp 角度。
11:40–12:40 T1,继续猜结论,猜测只要三维两两组合都满足上下界限制就是合法的,打了个表好像没什么问题,有个下去整应该是可以整除分块的,但是推的式子不是很简洁,调不出来。
回顾反思
T1:
结论
a
b
>
=
c
,
b
c
>
=
a
,
c
a
>
=
b
ab>=c,bc>=a,ca>=b
ab>=c,bc>=a,ca>=b ,这个东西是可以整除分块的。计算时可以使用容斥,用总方案减去不合法的方案数,即
a
b
<
c
,
b
c
<
a
,
c
a
<
b
ab<c,bc<a,ca<b
ab<c,bc<a,ca<b 这样情况比较简单而且不会重复计数。
考场上推的结论基本和正解等价,但是我是其下去整的形式,而且没有反应出来其与乘积的形式是对应的,于是式子就非常别扭,影响了进一步推导。
T2:
直接 dp 的过程是简单的。
然后考虑放在长链上长链剖分,对于一条长链上的 dp 值共用一个数组,直接继承,于是复杂度是 O(n) 的。
对长链剖分不太熟悉,需要练一练。
一个较简洁的指针版本长链剖分
T3:
先只考虑集合内元素种类计算所有极长区间,使内部元素种类确定时尽可能长,这样所有种集合都能被考虑到且所有重复的区间都是不交的,然后减去重复的集合数。极长区间可以用二维数点,计算重复的集合数可以用 max,min等形式表示出来,然后用单调栈和线段树简单维护。
考场上一直在想如何找到所有极长重复区间然后分讨计算,但是运用容斥的话就只用计数,而不用知道具体的位置了。