今天的比赛题目比较难,没有一个人切下一题。
7.10的比赛要注意:
0. 摆好蒟蒻心态,不要自以为是。
1. 至少打完三题暴力再死磕一题! (最后一题暴力没打,原因是不会?)
2. 首次思考时间控制在1h, 每一题都要保证至少思考20分钟,不要把容易拿的分丢掉了。 打完所有有(暴力)分的题之后再来继续想。 (最后一题只想了10分钟,原因是没想法)
3. 记得多根据数据范围与问题想一下学过的算法。 (没有很好的达成,第一题显然可以用线段树拿70分,可能是因为一直在想质数的情况?)
第一题有50分保证P是质数,所以可以特判x是P的倍数的情况。
剩下的因为没有逆元,所以只能考虑分解而不能考虑前缀和 。
用线段树或者rmq倍增将其分开,这样就能做到
其实这样反而麻烦了,注意到我们每一次查询都是k格,可以按k个一块分块。 这样每一次查询最多两个块。预处理也只有O(n). 因为n有2*10^7,注意卡常。暂时还不能理解这样分块的精髓…
第二题发现了双最,然后就二分+n log n判定。
但实际上是不需要二分的。我们考虑贪心,假如当前以r结尾的最优区间是[l,r]。 显然r=2的时候只有l=1.
一. 若m<=min,则当前[l,r]就是r处结束的最优区间。
显然对于任意的
因为若l增大,min会越来越大,而越来越小的m无法影响答案。
二. 若m>min,则
因为若l增大,则m会越来越小,min会越来越大。所以答案可能变小。
三.对于一个最优区间[l,r],r+1的最优区间
感性理解:
因为m<= min,所以将r后移意味着m增大,min减小,m与min的“距离”被拉开。又因为m,min一个变大一个变小,所以最优区间是m,min距离最近的地方(临界点)。
所以临界点会继续往后,而最优区间也会往后。
这样的话可以使用two-pointer,时间是
比赛的时候只想到了二分判定的方法。这个贪心如果理解的姿势错了的话,正确性不是很显然。
再来讲讲最尴尬的第三题。 明明很简单但没人会做。
给你一个sa数组,要你求这个字符串的最小字符集大小。对于sa[i]< sa[i+1],我们可以比较rk[sa[i]+1]与rk[sa[i+1]+1]。 若前者小于等于后者则显然sa[i]与sa[i+1]这个位置的字符是可以相同的。 否则就不可以。 又因为sa[i]是排好序的,所以从sa[1]做到sa[n-1]可以从大到小求出所有位置上的字符。
主要是利用了从第二位开始的sa,来推第一个字符的大小关系
7.11的比赛要注意:
0. 摆好蒟蒻心态,不要自以为是。
1. 至少打完三题暴力再死磕一题!
2. 首次思考时间控制在1h, 每一题都要保证至少思考20分钟,不要把容易拿的分丢掉了。 打完所有有(暴力)分的题之后再来继续想。
3. 记得多根据数据范围与问题想一下学过的算法。主要分几大块:dp,贪心,图论,数据结构,分治