模拟25—「random·string·queen」
random
看题需要一个世纪系列。
考试的时候推了个线性的式子,一看有\(70\mathrm{pts}\)就没梦想了。
以为式子能矩阵优化但是不会,所以没有继续下去。
实际上式子里面的系数是变量不能用矩阵优化
所以需要化简式子。
先看我推出来的式子,很好理解,纯根据题意推的,\(\mathrm{ans=f_n*\frac{4}{3}}\)。
\(g_i\)就是长度为\(i\)的序列的逆序对个数期望。
然后就到了化简时间。
通过拆开递归定义+等差数列公式完成化简\(g\)
不断拆递归定义,可以得到
然后利用平方和公式求出来\(f_n\)再乘上\(\frac{4}{3}\)就行了。
\(p.s.\)平方和公式是一个三阶等差数列,所以最高次数为\(3\)
所以可以直接设公式\(f_x=ax^3+bx^2+cx+d\)带入几个可以解出来\(a,b,c,d\),公式背不过,还是解方程比较爽。
string
考试的时候复杂度算的没问题\(70\mathrm{pts}\)然后就没梦想了,结果炸飞了就\(20\mathrm{pts}\)。
所以还是老老实实自己写\(\mathrm{Hash}\)吧。
正解是枚举分界点,然后看能匹配原串的后缀和前缀分别有多少个在乘起来。
但是如果每次都暴力找,复杂度不对。
所以考虑优化一下,直接二分找到最长的匹配串,但是发现我们还需要知道这个最长匹配串和他的子串一共有多少个。
需要做一个类似与前缀和的东西,这个直接把所有串扔到\(\mathrm{Tire}\)上遍历一边就行了。
queen
一道酸爽的分类讨论题
对\(k=1,2,3,4,5\)分别推柿子,情况要考虑全。
然后发\(k>5\)之后没有特殊情况只有对角线和横竖。
然后发现复杂度还是不对的。
这个时候就需要数学芝士来优化了。
发现有一个俩\(\sum\)搞一块的,化简一下拆开以后可以用\(\sum i,\sum i^2\)优化掉(怎么又是它?)
还有一个组合数求和。
用\(\sum_0^{m} C_n^i=C_{n+1}^{m+1}\)优化就行了。
考试的时候比较着急暴力都没打完,比较难受。
总结
这场考得很炸,不过炸出来一些收获。
\(\mathrm{T1}\)让我知道了矩阵不能优化系数为变量的转移,同时,复杂度爆炸的时候,考虑拆开柿子化简。
递归的式子比较好写,推规律的时候还是需要拆开递归定义。
\(\mathrm{T2}\)考场上没仔细想,其实处理一手\(\mathrm{Tire}\)处理前缀和也没什么特别的,不过让我知道了\(map\)的正确打开方式。
字符串还是不要用map<string int>这种偷懒操作,老实手写字符串\(\mathrm{Hash}\)
还有就是\(map\)不要用[]还检索是否存在,因为每次[]都会往\(map\)里面塞一个值,值越多越慢,检查有没有直接用mp.find(...)==mp.end()返回真代表没有...这个元素。
\(\mathrm{T3}\)大力分类讨论,考场上没看穿,这个就是要静心推柿子。
数学优化暂时想不太到,有其实组合数求和那个东西。

浙公网安备 33010602011771号