2024.10.3:
能够感受到出题人深深的恶意,扔了道 zak 没场切的交互,甚至 2e5 的输出关同步流被卡了。
A:
一共只有25n种本质不同的操作,不妨求出每种操作后的新串的平方子串个数,最后取其中最大值即可。 跨过它们的平方子串(包括修改后新生成的)的贡献。
记L=min(LCS(a,b),len),R=min(LCP(a+1,b+1),len−1),贡献为max(0,L+R−k+1)。
至于有修改的情况,不妨先考虑每种修改对L,R分别造成了什么影响。下以R为例说明,设修改了第i个点:
i∈[1,a]:R保持不变;
i∈[a+1,a+R],R变为i−(a+1)。
i=a+R+1:若将sa+R+1修改为sb+R+1,R变为R+1+LCP(a+R+2,b+R+2);否则,仍为R。
max(0,L+R−k+1)取哪一边,可以得到更细致的分类,每一类中的贡献都是一个关于i的一次函数。
于是只要对贡献数组做O(1)次区间加一次函数,差分即可。
B:
官解:
考虑三角剖分的对偶图 (去掉外部无限大的面对应的那个点) ,可以发现该对偶图构成一棵树。
并且,若以原图中边(1,n)所在的三角形为树的根,则其是一棵有根二叉树。
我们不妨将其视为一棵二叉搜索树。
在此建模中,可以发现,题面中的一次操作对二叉树形态的影响,相当于二叉树中的一次左旋/右旋操作。
同时,注意到点x为题面中的"关键点",等价于二叉树的根的左子树大小为x−2。
于是,若要使x成为关键点,只要将中序遍历中第x−1个点通过旋转操作转到根即可。
这可以使用 splay 做到均摊O((n+m)logn)次旋转操作。
C:
考虑一个长为n−1的排列插入n,有n种方式,且其对逆序对数的影响恰分别为+0,+1,+2,…,+(n−1)。
使用生成函数,得到长为n,逆序对数为m的排列数为:
[xm]i=1∏n1−x1−xi=[xm](1−x)n∏i=1n(1−xi)
由于m≤n,所以∏i=1n(1−xi)≡∏i=1∞(1−xi)(modxm+1)。
考虑五边形数定理(这辈子没想到会用这个):
F(x)=i=1∏∞(1−xi)=1+i=1∑∞(−1)ix2i(3i+1)
于是答案转化为[xm](1−x)nF(x)。
由于F在前m项中只有O(m)项是非 0 的,可以做到O(m)求解单次询问的答案,总时间复杂度O(n+Tm)。
2024.10.5:
A:
任意染色的总方案是mn,但存在本质相同的方案。考虑怎样的染色会等致本质相同,首先需要找到点的对应关系使原图同构。
因为原图为基环树,为了使对应后每条边仍合法,可知若环上点不与自己对应,只可能是将原图绕环旋些后新图与原图满足同构,考虑怎样求出最小旋转距离。
设环上总点数为len。为满足旋转后环上每点连出的树同构,先对每棵树进行树hash。
对于 hash值相等的所有树,找出它们在环上的间距,若间距均相等 (设为d) 则原图每旋转d这些树就会同构,若间距不等就只有旋转 len (即转回原图) 后这些树才会同构。
求出不同 hash值所需的旋转长度的 lcm,即可得到整个图的最小旋转距离(设为 D)。
现在已知所有合法的点的对应倩况,考虑统计染色方案。已知使图能同构的最小旋转距离D,可将环上每D个点及连出树归为一部分,共T=len/D部分。
每部分内的染色不会相互影响,只需算出该部分内所有树的不同构染色方案数相乘就得到每一部分的染色方案,可在树hash 同时用组合数求得。因为每部分都互相同构,染色方案都相同,设为f。
考虑用容斥计算最终本质不同的方案数,若每部分染色方案均不同,则答案应为TfT,因为每种本质相同的染色方案都在fT中算入了T次。
但因存在一些部分染色方案相同,可能导致这种本质相同的染色方案并没有没算够T次。
若染色方案由长为K的循环串重复T/K次后得到,则fT中它只被计入了K次。
从大到小枚举T的因数K,考虑将当前钦定偱环串长为K的本质相同染色方案补至T次,钦定循环串长为K的染色方案即为fK。
在之前枚举的K的倍数tK时,每次染色都会令其出现K次,因此只需用KT减去所有tK的系数a[tK]之和即可得到当前的fK的系数a[K]。
将所有fK系数算出来后相乘相加最后除T就得到本质不同的染色方案。
B:
建 SAM,用总的本质不同字符串对数减去存在包含关系的。
不妨枚举大串,计算为其子串的不同个数,为了避免算重,在大串第一次出现位置统计答案。
一个字符串所有子串第一次出现位置可以用插入每个前缀的lenp−lenfap刻画,即s1…p,s2…p,…,slenp−lenfap…p,左端点为一段前缀。
设l=lenp−lenfap,最后一次左端点出现在l之后的字符串显然可以和这l个字符串配对,否则可以和左端点位置个配对,注意减去重复的。
问题变为计算[l+1,p]的本质不同子串个数以及[1,l]的本质不同子串个数的左端点之和,二者本质相同。对 parent tree 上每个点维护上一次被标记的最右端点,每次更新s[i…p]的所有右端点等价于把p到根路径上区间赋值,显然可以把一条链上相同的标记一起考虑做一次区间加,这等价于 LCT 中 access 操作,直接上 LCT 即可。
随便用什么东西维护左端点的信息就完事了。
C:
先考虑L∈[l,r],R=r,即询问区间的所有后缀的贡献。
模拟一个左端点L=r,然后往前移动的过程,过程中维护最大值,并贡献答案。
对于每个点,找出其左边第一个大于它的点,这样的关系构成了树,并且上述过程中最大值的变化过程构成了一条向上的链。
记[L,R]最大值为sp,则这条链从R开始,到p结束,发现链上的点,除了p之外的点的贡献是可以预处理的,点x的贡献为sx×(x−fax)。
于是可以预处理树上前缀和之后再差分,对于p的贡献单独处理,L∈[l,r],R=r的部分贡献为sumR−sump+sp×(p−L+1)。
发现对于L∈[l,r],R=r的部分,贡献只与最大值处有关。仔细思考一下,在解决一个[L,R]的问题时,也可以视作只关注了最大值处,所以理论上,解决单个区间的复杂度与解决后缀区间的复杂度是几乎一致的。
于是只需要求出区间最大值的位置,就可以O(1)计算答案了。
2024.10.7:
A:
考虑用 ‘rxxx’ 填充矩阵,可以将位置 2 和 4 替换为 y,这样除了边上的 y 都可以提供 3 的贡献,共 38×19×3=2166,算上边上的共 2166+19×3=2223,优先填 3,最后用 1 补齐即可。
B:
考虑二分答案 mid,我们只关注学生能否使得被抓人数≤mid。
那么,所有人数≤mid的实验室就无关紧要了,只关心人数为a>mid的实验室,设同学有p的概率进入这个实验室,那么如果老师选择进入这个实验室,期望抓到的人数就是(1−p)×a。
所以我们要求对于任意这样的ai,都有(1−pi)×ai≤mid,据此可以求出每个pi的下界,全加起来看看到不到 1即可。
C:
?
D:
诶呦是原。
2024.10.8:
A:
设dpi,j,k表示序列a的前i个数,最大值为j,并且前i个数里有k个j的合法方案数,那么dpi,j,k可以转移到dpi+1,j,k,dpi+1,j,k+1,dpi+1,x,1(x>j)。
容易发现k≤bj,所以状态总数是O(n2)级别的,加上前缀和可以做到O(n2)。
B:
将式子转化一下:
(xmody)×y=(x−⌊yx⌋×y)×y=−⌊yx⌋×y2+x×y
这是一个关于y的二次函数,开口向下,所以最大值决策在[y2]×2x的前驱后继之中,整除分块使得⌊yx⌋为定值后查询区间前驱后继,可以做到预处理后O(1)查询。
容易发现这个东西可以线段树维护,复杂度为nnlogn,可以通过n≤105的部分分。
因为我们有O(n)次修改,O(nn)次查询,所以我们希望均摊后能做到O(n)修改,O(1)查询。考虑对值域分块,维护每一个值块内的前驱后继,散块可以直接查询,整块可以暴力查询,因为整除分块之后得到的区间是不交的,所以一个整块只会被暴力查询一次,复杂度是O(nn)。
C:
将斐波那契转化为通项公式形式:
fi=51⎝⎛(21+5)i−(21−5)i⎠⎞
令A=51,B=−51,x=21+5,y=21−5,那么有
fi=Axi+Byi
这是一个普通幂的形式,跟组合数的下降幂不太搭,观察到k比较小,考虑使用斯特林数把下降幂转化成普通幂:
fik=j=0∑k(−1)k−j[kj]fij
于是
原式 ×k!=i=l∑rj=0∑k(−1)k−j[kj](Axi+Byi)j=j=0∑k(−1)k−j[kj]i=l∑r(Axi+Byi)j=j=0∑k(−1)k−j[kj]i=l∑rp=0∑j(pj)ApxipBj−pyi(j−p)=j=0∑k(−1)k−j[kj]p=0∑j(pj)ApBj−pi=l∑rxipyi(j−p)
最后一个∑里面的东西使用等比数列求和即可。
但是发现 5 在模109+7意义下并没有二次剩余,所以需要手写一个。
时间复杂度O(k2log)。
D:
改牛魔。
哦,弱化版 链接。