2021.9.4省选
t1 按奇长度和偶长度分别进行二分答案,求路径容易想到点分治,每次考虑穿过重心的路径,重心会把路径分成两段,一条路径是合法的当且仅当长路径下面的一段与短路径相同,长路径去掉短路径后是回文串,枚举长链,短链长即为Lshort=L−LlongL_{short}=L-L_{long}Lshort=L−Llong,判断相等和回文都可以使用字符串哈希,知道短链长度相当于知道了短链,用哈希表判断一下重心往其他子树延伸是否会出现已知短链
t2 未知,行列式都不知道是啥
t3 整除可以看作一个偏序关系,若x∣yx|yx∣y那么就让xxx向yyy连一条边,通过dilworthdilworthdilworth定理可以知道,最长反链长度等于最小链覆盖,所以只需要求出这个偏序关系的最小链覆盖,考虑有一个集合SSS,设当前未被覆盖的最小的数为xxx,xxx肯定需要新开一条链,2x2x2x肯定也没有被覆盖,如果链不往2x2x2x延伸,那么2x2x2x也要多用一条链,不如直接往2x2x2x延伸
用这种构造方式,SSS的贡献就可以被分为两部分,SSS中奇数个数+SSS中是222的倍数且不是444的倍数并且质因数中只有222在SSS中
对每个数分别讨论贡献个数就可以做到O(n)O(n)O(n),发现式子的一部分是积性函数,就可以用min25min25min25筛优化
2021.9.28省选
t1 听说是min25min25min25筛,先咕了
t2 容易发现,答案只和奇链和偶链的个数有关,设f(n,m)f(n,m)f(n,m)表示有nnn条偶链,mmm条奇链的答案,容易发现链之间连的先后顺序比不影响答案,而且题目要求的答案是圆排列个数,先给每条链都编上号,考虑每种环只记录字典序最小的那个,连接链只把编号大的链连在编号小的链后,
当n≠0n\neq0n=0时,编号最大的偶链可以独自成环,或者接在其他偶链后,或者接在后,所以f(n,m)=(n+m)f(n−1,m)f(n,m)=(n+m)f(n-1,m)f(n,m)=(n+m)f(n−1,m)
当n=0,m≠0n=0,m\neq0n=0,m=0时,奇链不能独自成环,只能接在其他奇链后,就会多出一条偶链,所以f(0,m)=f(1,m−2)f(0,m)=f(1,m-2)f(0,m)=f(1,m−2)
特别的,f(0,0)=1,f(0,1)=0f(0,0)=1,f(0,1)=0f(0,0)=1,f(0,1)=0
t3 建出两个串的子序列自动机,设fi,jf_{i,j}fi,j表示到了第一个自动机的iii点,表示到了第二个自动机的jjj点还需要走几步到达目标状态,乍看是O(n3)O(n^3)O(n3)但事实上跑不满,所以可过
2021.10.4省选
t1 发现一个凸包不包含圆心,当且仅当,凸包上的一条边所代表的弧长大于等于l2\frac{l}{2}2l,考虑容斥,先算出一个凸包不包含圆心的方案数,再减去两个凸包都不包含圆心的方案数
一个凸包不包含圆心,若已经确定大于l2\frac{l}{2}2l的边,若边里有iii个点,那么这样的凸包就有2i−12^i-12i−1个,需特判等于l2\frac{l}{2}2l的,枚举其中一个点,找出最远的点,就可以等比数列求和
两个,考虑它们的交,交中的点可以选择进入两个凸包中的一个,所以也是222的幂次,但它们的并必须是全集,枚举交的一段,找出最远一端使得并为全集,用等比数列求和
t2 考虑分治,将≤mid\leq mid≤mid的数看成000,>mid>mid>mid的数看成111,现需将010101序列排序,先将0/10/10/1的段合并,每两个分一组做一遍操作,就会有一半的111被合并,操作数约为log\loglog级别,共有log\loglog层,所以总操作数约为log2\log^2log2级别
2021.10.6省选
t1 每个点都有一个区间,只有ccc在该区间内才有可能到达该点,维护每条重链的前缀区间交,二分出最前的需要跳轻儿子的点,跳到轻儿子,继续该过程,直到停下,时间复杂度O(nlog2n)O(n\log^2 n)O(nlog2n)
t2 容易发现,一个序列的答案是序列中的每个数的递归层数之和,设第iii个数和第i+1i+1i+1个数的分界点在tit_iti时间被找到,第iii个点的递归层数显然为maxti,ti+1\max{t_i,t_{i+1}}maxti,ti+1,第iii个分界点的时间为第一个[1,i][1,i][1,i]的数的在位置[1,i][1,i][1,i]中时,设pip_ipi为小于等于iii的数的最大位置所在,每次冒泡pip_ipi必然减一,所以ti=pi−it_i=p_i-iti=pi−i
当ti−1≤tit_{i-1}\le t_{i}ti−1≤ti时
∑i=1n∑j=in(n−in−j)(j−1)!(n−j)!(j−i)\sum_{i=1}^n\sum_{j=i}^n{n-i \choose n-j}(j-1)!(n-j)!(j-i)i=1∑nj=i∑n(n−jn−i)(j−1)!(n−j)!(j−i)
当ti−1>tit_{i-1}> t_{i}ti−1>ti时
∑i=1n∑j=in(i−1)(n−in−j)(j−1)!(n−j)!(i−j+1)\sum_{i=1}^n\sum_{j=i}^n(i-1){n-i \choose n-j}(j-1)!(n-j)!(i-j+1)i=1∑nj=i∑n(i−1)(n−jn−i)(j−1)!(n−j)!(i−j+1)
两式相加后按i,ji,ji,j分类,即可O(R)O(R)O(R)预处理得到答案
t3 还不会
2021.10.9联赛模拟
t1 发现mmm很小,O(m2)O(m^2)O(m2)枚举列的可能值,然后对于每种可能值,用O(n)O(n)O(n)的复杂度求出行有多少种方案,看似过不了,实际却过了,有更优的做法
t2 发现一个错排的权值为n−n-n−这个错排看成置换后的环的个数,考虑求出所有错排的环的个数的和,设fnf_nfn为长度为nnn的错排的环的个数和,pnp_npn为长度为nnn的错排数,考虑新加入一个数字nnn,第一种情况,我们可以将nnn插入1∼n−11\sim n-11∼n−1的任意一个数后面,贡献为(n−1)fn−1(n-1)f_{n-1}(n−1)fn−1,第二种情况,nnn和n−1n-1n−1自成一环,贡献为(n−1)(fn−2+pn−2)(n-1)(f_{n-2}+p_{n-2})(n−1)(fn−2+pn−2),(n−1)pn−2(n-1)p_{n-2}(n−1)pn−2的贡献是因为有(n−1)pn−2(n-1)p_{n-2}(n−1)pn−2种情况会多出的n−1n-1n−1和nnn的一个环
t3 一棵树的重心只有可能在这棵树的重链上,维护删除子树后的重链,倍增得到答案
t4 考虑随机化,给每个集合赋上一个[0,p)[0,p)[0,p)的权值,每次判断一个集合是否合法时,算出集合内的权值和,如果该集合合法,那么权值也能被ppp整除,不合法有1p\frac{1}{p}p1的概率输出合法,多次随机,错误率近似为000,用线段树维护即可
2021.10.16提高组模拟
t1 二分答案midmidmid,将所有经过midmidmid的之后不会覆盖除需要的点以外的点都找出来,bfsbfsbfs判断能不能覆盖所有的点
t3 先考虑链怎么做,容易想到一个n2n^2n2的dpdpdp,可以用线段树优化,需要实现加法和乘法,对于环,可以想到一个枚举开头是什么,然后用刚才的dpdpdp就可以求出答案,但是枚举开头复杂度显然太高,将最小的aaa作为开头,发现每个开头都是等价的,将其中一个作为开头的答案算出来,再乘上最小的aaa即可
2021.10.18提高组模拟
t1 对AAA和BBB分别建trietrietrie,考虑合并得到答案,对于两个结点aaa和bbb,显然先合并lson(a),lson(b)lson(a),lson(b)lson(a),lson(b),rson(a),rson(b)rson(a),rson(b)rson(a),rson(b),再合并lson(a),rson(b)lson(a),rson(b)lson(a),rson(b),rson(a),lson(b)rson(a),lson(b)rson(a),lson(b),最后再排序即可得到答案
t2 对与每个点求出每种颜色的连通块,然后枚举每种颜色的所有连通块,枚举连通块内的点和它们能到达的点,考虑扩展到其他颜色,对于和其他每种颜色的块保存一个总和,枚举连通块内的点时顺便减去交集
t3 显然答案就是最小生成树,考虑如何求异或最小生成树,对于第iii位,将第iii位为000的数和第iii位为111的数之间至少有一条边,让这条边最少且最小,trietrietrie树完成即可,后面的部分很简单,不写了
t4 先不考虑xxx的限制,那么sss的限制相当于有mmm个异或方程,要求出这mmm个方程的解的个数,可以高斯消元后判断一下有多少个方程,用总未知数个数减去方程个数,就是自由元个数,令其为kkk,答案显然就是2k2^k2k,中途判断一下是否会无解,加入xxx的限制相当于多一个方程,先判断这个方程是否能由原来的方程得到,如果不能,自由元减少一个,如果冲突,说明无解
2021.10.19提高组模拟
t1 神奇构造题,首先考虑从前往后一个一个修改,已经相同就到下一个位置,如果当前是AB⋯⋯AB\cdots\cdotsAB⋯⋯和B⋯⋯B\cdots\cdotsB⋯⋯,考虑用两次操作交换前后,如果当前位置是AC⋯⋯AC\cdots\cdotsAC⋯⋯和B⋯⋯B\cdots\cdotsB⋯⋯,直接一次修改得到,如果是AA⋯⋯AA\cdots\cdotsAA⋯⋯也就是说,它后面有一串AAA的话,考虑找出最前一个不是AAA的地方,然后从那个地方往前交换,使得这中间一段相邻都不相同,然后再套用前面的解法,如果后面一串全部相同的话,就倒过来再来一遍,看上去次数最多是6n6n6n,但跑不满,至于为什么一定能找到解,我也不知道
t2 计算一个结点uuu的贡献,考虑将uuu儿子的贡献继承到uuu上,显然有问题,思考其与真实值不同的地方,首先,一条链的顶端如果在儿子上,那么就会多算,将这部分减去,其次,如果有一条链穿过结点uuu,且uuu这种颜色在该链中第一次出现,将这部分加上,现在主要问题就是如何求出uuu在多少条链中第一次出现,可以离线后用线段树求出
t3 对于一条s→x→ts\rightarrow x\rightarrow ts→x→t的途径,考虑在xxx处折一下,到达终点后111和−1-1−1的数量一定是相同的,所以可以发现xxx上的数字和折后的位置上的数字是相同的,也就是说,原图上的一条斜下对角线上的数字应该是相同的,将问题变成了序列上的合法括号序问题,设f(i,j)f(i,j)f(i,j)表示前iii个括号,左括号比右括号多jjj个的贡献,用矩阵乘法就可以做到O(t3klog(n+m))O(t^3k\log (n+m))O(t3klog(n+m)),但是依旧很慢,发现矩阵乘一个向量的复杂度只有O(t2)O(t^2)O(t2),考虑用这个性质优化,预处理出所有2i2^i2i次幂的矩阵,复杂度为O(t3log(n+m))O(t^3\log(n+m))O(t3log(n+m)),转移的时候就不必再用快速幂求出矩阵的幂次,可以直接用预处理出的矩阵乘上向量转移,时间复杂度为O(t2klog(n+m))O(t^2k\log(n+m))O(t2klog(n+m))
t4 根本就不会
2021.10.21提高组模拟
t1 设fi,jf_{i,j}fi,j表示SSS以iii结尾,TTT以jjj结尾的贡献,对于前面的一组k,lk,lk,l,我们将fk,lf_{k,l}fk,l的贡献记在lll上,由于iii从小到大枚举,所以iii必定是满足条件的,考虑如何满足jjj,SiS_iSi和TjT_jTj是一样的,所以对于一个lll,如果它有一条边到iii,意味着之前将贡献记在lll上的fk,lf_{k,l}fk,l都能转移到fi,jf_{i,j}fi,j直接累计加上即可
t2 直接010101分数规划
t3 水题,细节多
t4 设fif_{i}fi为恰好覆盖了前iii个点的贡献,fi=∑Rj=i∑k=Lj−1i−1fk∏k<Lw≤Rw≤i(vw+1)f_{i}=\sum_{R_j=i}\sum_{k=L_j-1}^{i-1}f_{k}\prod_{k<L_w\le R_w\le i}(v_w+1)fi=∑Rj=i∑k=Lj−1i−1fk∏k<Lw≤Rw≤i(vw+1),由于iii从小到大枚举,所以Rw≤iR_w\le iRw≤i的条件可以直接满足,考虑将区间Lw,RwL_w,R_wLw,Rw的贡献存在www上,那么后面的式子就变成了一个连乘式,将它改写为前缀积除于前缀积的形式,跟iii有关的项移到外面,里面就是一个跟kkk有关的和式,线段树维护即可