纪中集训2020.02.05【NOIP提高组】模拟B 组总结反思——【佛山市选2010】组合数计算,生成字符串 PPMM
JZOJ2290. 【佛山市选2010】组合数计算
比赛时
一看到数学题就有一种厌倦感。不论如何,还是仔细思考吧,按照公式的直接求法显然时间会爆(听同学说有一种快速求阶乘的方法,但是对于这题肯定要高精度,太麻烦了)。间接入手,杨辉三角???时间复杂度和空间复杂度均为\(O(n^2)\),显然不行。有没有快速求组合数的方法呢,显然我除了杨辉三角一个都没有学。于是我开始找杨辉三角的其他规律——一无所获,大数学家都不能找到,蒟蒻的我肯定找不到。突然蹦出一个奇妙的想法,杨辉三角+暴力,因为题目保证答案在64位无符号整数取值范围内,于是便输出了一下杨辉三角,发现当n很大以后(\(\geq 1000\)左右),答案很大,几乎当\(m>20\)时,全都爆表了,于是我预处理\(n \leq 2000\)的组合数,其他暴力算,加了一点点小优化,比如说n=5,m=2。c(5,2)=(54)/(21),那么我们再算54的过程中,如果除21中的某个数没有余数就除,再标记一下除过了。另外,记得输出用%llu。骗了50分!!!
之后
有一个变态的数据——\(n=0,m=0\)特殊判断一下。我比赛时脑子卡壳,居然忘记加上\(if(n-m<m),m=n-m\)。一顿改良之后,骗了AC100!!!。正解——lucas,自闭改题中。
JZOJ2291. 【佛山市选2010】生成字符串
比赛时
我猜想是贪心或者DP,一下子想不出来,果断弃疗。我最不擅长这种区间DP。
之后
首先,简化题目,把相邻的相同的多个字符合成一个。设\(s\)表示合并之后的字符数组,\(f_{j,i}\)表示从第\(j\)个字符开始长度为\(i\)的字符串生成最小步数,。转移
-
\(f_{j,i}=f_{j,i-1}(s_j==s_{j+i-1})\),因为这段字符串的第一个等于最后一个,所以他们有可能是在一起的,只用生成一次,中间再插入其他东西。
-
\(f_{j,i}=min(f_{j,i},f_{j,k-j+1}+f_{k+1,(j-i+1)-(k+1)+1})(无条件)\),这个很容易理解吧,劈成两半。
总结
遇到一些题目时,可以尝试简化题目。另外,我得加强一下我的区间DP了。
JZOJ2292. PPMM
比赛时
题目写着\(-231<x<231\),于是打了个权值线段树,因为有了取反的操作,所以如果不真的进行取反,答案就是要么取最大(取反次数为偶数时),要么取最小 (取反次数为奇数时),加入的时候如果取反次数为奇数,对加入的数取反即可,线段树维护最大和最小。想着能AC,结果10分。
之后
题目出错了!!!\(-2^{31}<x<2^{31}\),实际是这样的,坑人呀!!!我想了一个方法——两个堆,一个大根,一个小根,跟之前的线段树思想差不多,但是删除上会遇到麻烦,因为要知道它在堆中的位置。正解——单调队列,插入排序的思想,感觉这个时间复杂度太玄学了!!!自己的想法(虽然不想打)——离散化+权值线段树。