Loading

模拟25—「random·string·queen」

random

看题需要一个世纪系列。

考试的时候推了个线性的式子,一看有\(70\mathrm{pts}\)就没梦想了。
以为式子能矩阵优化但是不会,所以没有继续下去。
实际上式子里面的系数是变量不能用矩阵优化
所以需要化简式子。

先看我推出来的式子,很好理解,纯根据题意推的,\(\mathrm{ans=f_n*\frac{4}{3}}\)
\(g_i\)就是长度为\(i\)的序列的逆序对个数期望。

\[p_i=p_{i-1}+(i-1) \]

\[g_i=g_{i-1}+\frac{p_i}{i} \]

\[f_i=\frac{i-1}{i}*f_{i-1}+\frac{g_i}{i} \]

然后就到了化简时间。

\[g_i=g_{i-1}+\frac{\sum_{j=1}^{j-1}j}{i} \]

\[g_i=g_{i-1}+(\frac{\frac{(i-1)*i}{2}}{i}=\frac{i-1}{2}) \]

\[g_n=\sum_{i=1}^{n}\frac{i-1}{2}=\frac{(i-1)i}{4} \]

通过拆开递归定义+等差数列公式完成化简\(g\)

\[f_i=\frac{i-1}{i}f_{i-1}+(\frac{(i-1)i}{4i}=\frac{i-1}{4}) \]

\[f_i=\frac{i-1}{i}*(\frac{i-2}{i-1}*f_{i-2}+ \frac{(i-1)(i-2)}{4(i-1)})+\frac{(i-1)i}{4i} \]

\[f_i=\frac{i-2}{i}f_{i-2}+\frac{(i-2)(i-1)+(i-1)i}{4i} \]

不断拆递归定义,可以得到

\[f_n=\frac{\sum_{i=1}^{n}(i)*(i-1)}{4n}=\frac{\sum_{i=1}^{n}i^2-\sum_{i=1}^{n}i}{4n} \]

然后利用平方和公式求出来\(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}\)大力分类讨论,考场上没看穿,这个就是要静心推柿子。
数学优化暂时想不太到,有其实组合数求和那个东西。

posted @ 2021-07-29 21:46  Soresen  阅读(42)  评论(0)    收藏  举报