这次考试总体来说还是挺简单的,但由于T2卡常,导致T3只打了30分的暴力。
T1
挺像原来B组的T2,但是由于每次都是固定数m次,所以可以每次直接跳到改取mod的那次操作,
因为mod越来越大,
从n->n-m+1->n-2*m+1,
跳的次数从m->m/2->m/3-......>m/(n/m)
可以发现是个调和级数,时间复杂度 $ O(m*ln(m)) $。B哥说复杂度是O(m+log2(m))
但是我没听懂他的证明。
ps:和我的思路一样的代码在m=1e7是都会TLE,足以证明log是乘而不是加
T2
我的打法是分治,[L,R]的ans分为[L,mid]的ans和[mid+1,R]的ans,以及两边乘起来的贡献。
需要维护以下几个量:
$sum a[i]^2$
$sum b[i]^2$
$sum a[i]*b[i]$
用线段树实现即可。
T3
其实很水......
f[i][j]代表a序列考虑到第i个,b序列考虑到第j的且b[j]必须选的LCIS。
g[i][j][0/1]代表f[i][j]的转移点,记两个的原因下面有。
1>a[i]!=b[j] f[i][j]=f[i-1][j],g[i][j][0/1]=g[i-1][j][0/1];(i并不一定从i-1转移,所以g要开两个)
2>a[i]==b[j] f[i][j]=max{f[i-1][k]}+1,g[i][j][0]=i-1,g[i][j][1]=k;
k其实不用枚举,因为在枚举j的时候把合法的f[i-1][j]加入集合即可。
复杂度 $ O(nm) $
(✿◕‿◕✿)