2024.10.[2, 3]训练记录
10.2上午noip模拟
比赛是8:00开始的,人是8:40起床的。
T1
猜了结论,秒了。
结论是,一开始按照倒序排,连续是 \(1\) 的段 \(reverse\) 成正序。这样逆序对最多。
感觉做法太简单 \(O(n \log n)\) 肯定不放。于是想了 \(O(n)\) 做法。
最开始有 \(\dfrac{n*(n-1)}{2}\) 个逆序对,按段考虑贡献。就是 \(O(n)\)。
后记:\(O(n \log n)\) 放了,输。
10.3晚上订正
回校,死。
今天cs版本更新我没更。一天没玩。表扬自己。
T3
考场打完T1去cs了。没看T3。
考虑容斥。
按最终答案里最大值的归属来讨论。
注意到,统计的是最后那个取过最大值的三元组的个数。
所以考虑方案时最多考虑选 \(3\) 个。(选完 \(3\) 个决出 \(max\) 的话再选就没用。)
最大值来自于 \(1\) 个三元组时:
从 \(n\) 个中选出这一个,\(n\) 种。
最大值来自于 \(2\) 个三元组时:
先选出来两个,方案数 \(C(n, 2)\)。
设选的为第 \(i,j\) 个。
于是当 \(a_i < a_j, b_i < b_j, c_i < c_j\) 时,相当于只选了 \(j\),和第一种情况算重。
于是减去所有的三位偏序个数。
最大值来自于 \(3\) 个三元组时:
选出三个的方案是 \(C(n, 3)\)。
当且仅当最后的最大值来自于一或两个三元组时算重。
这时,这一或两个三元组中必有一个取到的最大值个数 \(\geq 2\)。(及最后三元组的三个值中有不少于两个值来自这个三元组。)
枚举这个三元组下标 \(p\)。设另外两个是 \(i,j\)。
当最大值取到 \(a, b\) 这两个位置时。
\(a_i < a_p, a_j < a_p\)
\(b_i < b_p, b_j < b_p\)
这是个二维偏序。
把这个数量减掉,再减掉\(ac、bc\)的情况。
这时发现,满足三维偏序的情况被多减了两次,加回来即可(可复用第二种情况求过的三位偏序)。
最后全部求和就是总方案数。