省选模拟5 总结
改题(T3)真的改到自闭。。。
T1:
第一眼错觉是网络流,但是在每个石头,站不同青蛙时跳跃的代价不同,就不太能了。
这题其实和之前noip模拟16的那个青蛙题有点像,只不过这题加了代价。首先一个性质是:对于一个青蛙,如果他一心想跳到对面(即不考虑踩光石头),最优是不花费,要不然只花一次就过去。那么我们可以看看所有石头可以让多少只青蛙不花费过去,让最贵的青蛙免费过去一定不差,假如它花费,那么可以替换为便宜青蛙花费使之更优。这个问题就和Blue一样了,只要不断挨个让青蛙往右跳,跳他能免费到的最大距离。剩下的青蛙花一次费过去。如果中途有两石头距离大于D,就是没有免费过去的,这时候需要用最便宜青蛙去踩石头。
贪心问题真是不好想到,至今不懂贪心的真正内涵。
T2:
法一:
主要思想是把自然数幂和化成K级别的多项式,那么原来的枚举值域就成了一个底数,枚举K就可以接受了。
用伯努力数拆自然数幂和,不断提前枚举顺序,加上二项式展开,最后就能把循环全化成K级别的,伯努力数$K^2$预处理就行,然后剩下的部分都可以预处理了。
式子特别长,细节挺多的吧。
法二:
发现题目让求得其实是一个多维前缀和?可以理解成定积分。最里层的多项式幂和是一个K+1次多项式,它做一次前缀和就成了K+2次多项式。然后再做前缀和(这次自变量是$i$,那么关于i的多项式是关于$a+i*d$的多项式变换(画成图像的话就是压缩d倍)得来的),同样,变为K+3次多项式。那么用插值就可以了。
T3:
具体做法并不想多写了。这题用到SAM和LCT,但是用的都是他们的性质,在原理的基础上拓展。
一开始我就想错了,我查询时直接让size>=2的endpos的len去做贡献,而没有考虑询问区间对具体的endpos位置的要求。也就是说,对于询问[l,r],当endpos中有两个落在[l,r]才可以做贡献。我们考虑往后insert时,加入一个字符的影响(贡献)。原先的len可能不能贡献,但是一旦它后面有了包含这段的子串(他们就是一对字符串了),就能做贡献了。后缀ParentTree的性质:跳father相当与跳到后缀,那么新点的祖先们就可以一起(和新点)做贡献了。具体的贡献要取决与endpos的last位置(最右位置),所以要维护last,链修改,动态边,就用LCT了。对于答案的维护,考虑节点的贡献,当询问包含它时才做贡献。还是考虑先满足一维:对于最后添加的每一个位置n,他一定可以被右端点大于n的区间包含。对于左端点:如果一点p的最优答案是len,那么只有左端点<=p-len+1时才贡献。二分询问的答案mid,那么要是有>=mid的答案,起码要从l+mid-1开始贡献,那么查询[l+mid-1,r]的最大点贡献验证是否>=mid。这两维用可持久化线段树维护最大值。
这题又调了一整天,发现我的很多问题。首先是思考问题很不全面,细节不清。调试能力太拙劣。对于这样的抽象复杂的问题,手模、输出变量简直是浪费时间。静态差错非常重要啊。