时间安排
8:00–8:05 读题。
8:05–8:30 T1,对于n,m小的可以直接做。对于大的可能要考虑一下性质。
8:30–8:50 T2,暴搜。对于次大值不是很好处理。
8:50–9:00 T3,前20pts可以暴力DP,不过显然非常的劣。考虑怎么优化,发现对于一个数列和好做的,考虑能否拼在一起,发现不好做。
9:00–9:10 T3,重新审视T3,发现瓶颈在与min函数非常烦,需要转化成其他的什么东西,考虑钦定最小值,但是这样又要讨论年最小值是a的还是b的,没什么用。
9:10–9:20 T2,重新审视T2,感觉可以二分答案,二分权值上界,然后check,问题是要check什么,怎么check。
9:20–10:00 T1,预感到在模意义下存在环,于是找环,环长不会太大,猜想了各种性质优化了朴素暴力。想用大样例拍一下,发现根本没有大样例。
10:00–11:10 T1,対拍,发现之前猜想的很多关于环的性质都是错的,还发现了一些我忽略的漏洞和边界情况,不过不影响核心。对原作法进行了补充和修正。
11:10–11:30 思考T2,T3。
11:30–11:55 吃饭。
11:55–12:00 T3,由在线询问改成离线预处理,O1回答。
回顾&反思
T1:感觉套路似曾相识,就是把1111这样的数变成100000…00的优美形式,然后利用欧拉定理计算答案。其中有一些关于整除的运算是我以前不太理解/会的,要学习。
T2:二分答案,关键在于check的思想,对于部分分,可以将逾越限制的赋权值,限制足够的不赋权值,那么通过比较求解的权值和就可以知道是否有超过限制的记入答案,加上01BFS优化就有60pts了。正解的check更巧妙,可以想到如果二分次小值,那么如果满足限制只与点的联通性有关,由于至多有一条边,这个信息时简单的,那么就变成了散点的信息的比较,进一步的,建立kru重构树,由于任意边权对应若干独立区间,就变成了整齐的区间信息的比较,区间查询即可。
check时钦定是否有贡献来确定存在性,以及将散点变成区间的思路要学习。
T3:转化min函数,我比赛的时候将min看作一个权值,这样就要枚举权值,然而对于一个值,其值域每个位置都时一个点,那么就可以反过来钦定每个位置的点,去找满足条件的ab,问题就会简单很多。组合数求解。对于组合数过大的情况,考虑lucas本质,是对组合数进行P进制分解,每一位独立相乘,这样就转变成了数位DP问题。
几个trick:1.将权值看成散点从而将权值和转化为方案数2.将知a求满足的b问题变为枚举b求满足的a的问题,逆向思考。3.对lucas的深度理解,P进制拆分的组合数相乘。4,将原本枚举整个数满足条件的问题,在进制拆分后变为每个位满足条件的数位DP问题。(在整个数特别大的时候有奇效)。
ps:尤其时没大样例也没法拍的时候,一定要检查暴力的正确性!!!T2 写个暴搜因为没有完全回溯挂了20真的吐了,100->80真的难看。