这套题是真的很好,除了题目都有思路之外,还卡掉很多细节。
然而卡细节是考过的很多考试中从未考过的。
比如 T1T1 卡掉不开 long longlong\space long 的巨佬们, T2T2 卡掉像我这样的蒟蒻连用 77memset 的人。
因为这套题没有评测系统,所以就不附代码了 因为我也不知道是不是对的,虽然本地用 lemon 测过,但是学生机都是老年机!
本文不久会附上测试所用的数据、 stdstd、题解和题目(pdfpdf 版)

多年准备一场空 系列套题

T1 分数转换

Input le:frac.inInput\space file: frac.in
Output le:frac.outOutput\space file: frac.out
Time limit:1.5secondsTime\space limit: 1.5 seconds
Memory limit:512megabytesMemory\space limit: 512 megabytes

题目

「多校联考」第三周二场

考场思考(正解)

一道送分题…
至于怎么将无线小数转分数,可自行百度。 巨佬可自推,其实像我这样的蒟蒻都可以退出来
但是要注意,会爆 int ,然而又有巨佬要开 __int128 ,结果被编译器坑掉,悲惨 CECE
其实开 long long 就可以了,何必要管那么多呢?
但是要注意,数据给出类似 0.33333[3]0.33333[3] 的情况,这样的情况下,必须把输入处理为 0.[3]0.[3]
当然,这可能是我自己码代码时不注意出现的 bugbug ,巨佬们能够完全避免就别管这句话吧…

多年准备一场空,不开 long longlong\space long 见祖宗。


T2 Slow Path Finding Algorithm (SPFA)

「多校联考」第三周二场
「多校联考」第三周二场

考场思路

这道题考场上看,感觉是比较简单的。
定义状态 dp[i][j]dp[i][j] :走到 ii 点,字符 jj 出现次数的最大值。
为了还原路径,再定义 pre[i][j]pre[i][j]dp[i][j]dp[i][j] 是从哪个点转移过来的。
然后根据这个状态,跑一边 spfaspfa 即可。
但是因为是多组输入,所以注意数组的清空,然后我使用了 memset

正解

思路都对,但是 memset 有点问题。
然后我被卡掉了…
下次我用 for() 来清,再也不装 XX 了…

多年准备一场空,全用 memmem 见祖宗。


T3 切面包

「多校联考」第三周二场

考场思路

这道题因为在考试的时候调 T2T2 过久,所以题都没看。

正解

20pts 思路
这个思路并不是测试点 11 的分,而是测试点 22 的分。
为什么?仔细一想,499122176998224352=12\frac{499122176}{998224352}=\frac{1}{2},并且没有事件一,那么这个数据点就很简单了。
想必具体思路不必过多赘述了吧 ????。
40pts 思路
测试点 22 过了之后,再暴力搜出所有的情况,时间复杂度 O(n+m2n)O(n+m\cdot 2^n)
这样就可以拿 40pts40pts 的高分了,在对于这道题不够擅长的情况下, 200pts+40pts=240pts200pts +40pts=240pts 已经是这一套题的最高分了。


100pts 思路

本思路来源于 High School Affiliated to Southwest University 学校的 jiangly 巨佬

下见题解图片,黄色标记处为题解错误,标记处应为 +2i=1n2pipi+12+2\sum_{i=1}^{n-2}p_i{p_{i+1}}^2少了一个系数 22
「多校联考」第三周二场
现在我来加以解释 巨佬可直接忽略
首先,我们引入一个变量 xix_i
xi=1x_i=1 时,表示这段面包的 ii 位破掉。
xi=0x_i=0 时,表示这段面包的 ii 位是完好的。
那么,当我们用 xix_i 来表示这段面包的 破损//完好 情况时,得到的是一个 0101 串。
那么,在什么时候,我们所拥有的面包段数会增加呢?
为了方便考虑,我们只关注两段面包的情况,先假设前面的面包完好,对于一些有问题的情况,我们在之后进行排除即可。


情况一:两个连续的面包完好的情况
「多校联考」第三周二场
即当 0000 出现的时候,这时面包段数不会增加。


情况二:两个连续的面包破损的情况
「多校联考」第三周二场
即当 1111 出现的时候,这时面包段数不会增加。


情况三:两段面包前好后破的情况
「多校联考」第三周二场
即当 0101 出现的时候,这时面包段数不会增加。


情况四:两段面包前破后好的情况
「多校联考」第三周二场
即当 1010 出现的时候,这时面包段数会增加


通过对上面情况的分析,当前面的面包完好的情况下,只有当 1010 情况出现时,面包段数会增加。
用数学语言表述就是x=1+i=1n1(xi+xi+1xixi+1)x=1+\sum_{i=1}^{n-1}(x_i+x_{i+1}-x_ix_{i+1})仔细体会这个公式,其中,前面 +1+1 是特殊处理最前面 x0=1x_0=1 的情况,其他的细节不多说,你会发现我们前面的定义:

xi=1x_i=1 时,表示这段面包的 ii 位破掉。
xi=0x_i=0 时,表示这段面包的 ii 位是完好的。

这个定义是多么的方便。
我们再换个分析方式,假设每个断掉的面包都可以分出左右两段,如图:
「多校联考」第三周二场
这个时候,每个断掉的面包都可以分出两段,那么就有x=1+i=2n1xix=1+\sum_{i=2}^{n-1}x_i但是,问题呼之而出,当两段连续的面包一起破损的时候,是不会产生新的面包,要减去这样的情况。
那么最后的公式就是x=1+i=2n1xii=1n1xixx+1x=1+\sum_{i=2}^{n-1}x_i-\sum_{i=1}^{n-1}x_ix_{x+1}但是,这道题要求的是 x2x^2 ,那么怎么做呢?
还能怎么做?暴力展开 x2x^2 啊…
前面已经得到:
x2=(1+i=2n1xii=1n1xixx+1)2x^2=(1+\sum_{i=2}^{n-1}x_i-\sum_{i=1}^{n-1}x_ix_{x+1})^2将这个括号打开:
x2=1+2i<n2j<nxixj+1i<n1j<nxixi+1xjxj+1+22i<nxi21i<nxixi+122i<n1j<nxixjxj+1x^2=1+\sum_{2\le i<n}\sum_{2\le j<n}x_ix_j+\sum_{1\le i<n}\sum_{1\le j<n}x_ix_{i+1}x_jx_{j+1}+2\sum_{2\le i<n}x_i-2\sum_{1\le i<n}x_ix_{i+1}-2\sum_{2\le i<n}\sum_{1\le j<n}x_ix_jx_{j+1}但是,我们最后要求的其实是期望,所以要将所有的 xix_i 换成概率 pip_i
这里有点太复杂了,我们用概率运算一项一项地展开这六项。


第一项
1=11=1这个应该没有问题…我们已经解决 16\frac{1}{6} 了,加油 ????。


第二项
2i<n2j<nxixj=(2i<npi)22i<npi2+2i<npi\sum_{2\le i<n}\sum_{2\le j<n}x_ix_j=(\sum_{2\le i<n}p_i)^2-\sum_{2\le i<n}{p_i}^2+\sum_{2\le i<n}p_i具体做一下解释,情况 AABB (AB)(A\neq B) 一起发生的概率为
P(AB)=P(A)×P(B)P(AB)=P(A)\times P(B)但是,当情况 AABB (A=B)(A=B)一起发生的概率为P(AA)=P(A)P(AA)=P(A)这是特殊情况,所以我们先要减去 A=BA=B 这样的特殊情况的错误计算方式,再加上它们的正确计算方式。


第三项
1i<n1j<nxixi+1xjxj+1\sum_{1\le i<n}\sum_{1\le j<n}x_ix_{i+1}x_jx_{j+1}这种情况有点复杂,我们分开讨论。

-当 i=ji=j(i=1n1pipi+1)2i=1n1pi2pi+12+i=1n1pipi+1(\sum_{i=1}^{n-1}p_ip_{i+1})^2-\sum_{i=1}^{n-1}{p_i}^2{p_{i+1}}^2+\sum_{i=1}^{n-1}p_ip_{i+1}

  • i=j1i=j-11in2pipi+1pi+2i=1n2pipi+12pi+2\sum_{1\le i\le n-2}p_ip_{i+1}p_{i+2}-\sum_{i=1}^{n-2}p_i{p_{i+1}}^2p_{i+2}
  • i=j+1i=j+11in2pipi+1pi+2i=1n2pipi+12pi+2\sum_{1\le i\le n-2}p_ip_{i+1}p_{i+2}-\sum_{i=1}^{n-2}p_i{p_{i+1}}^2p_{i+2}其实是和第二个情况是一样的。

所以,第三项总共就是(i=1n1pipi+1)2i=1n1pi2pi+12+i=1n1pipi+1+21in2pipi+1pi+22i=1n2pipi+12pi+2(\sum_{i=1}^{n-1}p_ip_{i+1})^2-\sum_{i=1}^{n-1}{p_i}^2{p_{i+1}}^2+\sum_{i=1}^{n-1}p_ip_{i+1}+2\sum_{1\le i\le n-2}p_ip_{i+1}p_{i+2}-2\sum_{i=1}^{n-2}p_i{p_{i+1}}^2p_{i+2}我们终于完成 12\frac{1}{2} 了,然而我的脑细胞也被杀掉 12\frac{1}{2} 了 ????。


第四项
可以直接建立等式22i<nxi=22i<npi2\sum_{2\le i<n}x_i=2\sum_{2\le i<n}p_i


第五项
也可以直接建立等式2i=1n1xixi+1=2i=1n1pipi+1-2\sum_{i=1}^{n-1}x_ix_{i+1}=-2\sum_{i=1}^{n-1}p_ip_{i+1}


第六项
我们先将 - 抛弃,等会在括号之前加上即可。
先进行直接转换:2(i=2n1pi)(i=1n1pipi+1)2(\sum_{i=2}^{n-1}p_i)(\sum_{i=1}^{n-1}p_ip_{i+1})

  • i=ji=j 时,需要2i=2n1pi2pi+1+2i=2n1pipi+1-2\sum_{i=2}^{n-1}{p_i}^2p_{i+1}+2\sum_{i=2}^{n-1}p_ip_{i+1}
  • i=j+1i=j+1 时,需要2i=1n2pipi+12+2i=1n2pipi+1-2\sum_{i=1}^{n-2}p_i{p_{i+1}}^2+2\sum_{i=1}^{n-2}p_ip_{i+1}

然后,我们将他们加起来,就是第六项了:
2(i=2n1pi)(i=1n1pipi+1)2i=2n1pi2pi+1+2i=2n1pipi+12i=1n2pipi+12+2i=1n2pipi+12(\sum_{i=2}^{n-1}p_i)(\sum_{i=1}^{n-1}p_ip_{i+1})-2\sum_{i=2}^{n-1}{p_i}^2p_{i+1}+2\sum_{i=2}^{n-1}p_ip_{i+1}-2\sum_{i=1}^{n-2}p_i{p_{i+1}}^2+2\sum_{i=1}^{n-2}p_ip_{i+1}
不要忘记了前面我们省掉的 -


最后,将所有的化简结果 其实并没有化简,只有结果 加起来,就是我们的 x2x^2 的了。
x2=1+(2i<npi)2+3i=2n1pi5i=1n1pipi+1+2p1p2+2pn1pni=2n1pi2+(i=1n1pipi+1)2x^2=1+(\sum_{2\le i<n}p_i)^2+3\sum_{i=2}^{n-1}p_i-5\sum_{i=1}^{n-1}p_ip_{i+1}+2p_1p_2+2p_{n-1}p_n-\sum_{i=2}^{n-1}{p_i}^2+(\sum_{i=1}^{n-1}p_ip_{i+1})^2
i=1n1pi2pi+12+2i=1n2pipi+1pi+22i=1n2pipi+12pi+22(i=2n1pi)(i=1n1pipi+1)+2i=2n1pi2pi+1+2i=1n2pipi+12-\sum_{i=1}^{n-1}{p_i}^2{p_{i+1}}^2+2\sum_{i=1}^{n-2}p_ip_{i+1}p_{i+2}-2\sum_{i=1}^{n-2}p_i{p_{i+1}}^2p_{i+2}-2(\sum_{i=2}^{n-1}p_i)(\sum_{i=1}^{n-1}p_ip_{i+1})+2\sum_{i=2}^{n-1}{p_i}^2p_{i+1}+2\sum_{i=1}^{n-2}p_i{p_{i+1}}^2
公式终于推完了,可能有点乱,把一些项数进行了合并
然后,我们怎么做呢?
我的方法时使用八颗线段树分别维护 pipi2pipi+1pi2pi+1pipi+12pi2pi+12pipi+1pi+2pipi+12pi+2p_i、{p_i}^2、p_ip_{i+1}、{p_i}^2p_{i+1}、p_i{p_{i+1}}^2、{p_i}^2{p_{i+1}}^2、p_ip_{i+1}p_{i+2}、p_i{p_{i+1}}^2p_{i+2} 即可。

多年准备一场空,不学数学见祖宗


相关文章: