清华集训2016合集

总结:

这一年的清华集训题虽然没有非常毒瘤的题但总体来说难度较大(可能是我比较蒟蒻),覆盖的算法比较全面且很有思维难度,在这里做一下题目总结及简略题解(详细题解请转至对应题目题解的博客)。

Alice和Bob又在玩游戏

$solution$:$SG$函数+trie树合并

 显然每棵树是一个单一游戏,求出每棵树的$SG$值再将所有树的$SG$值异或起来就能判断谁能赢。我们设对以$x$为根的子树进行游戏的$SG$值为$sg[x]$。想要知道$sg[x]$就需要知道所有后继状态的$SG$值(一个后继状态的$SG$值即进行一次操作后这棵树分成的所有子树的$SG$值的异或和),然后对于这些$SG$值取$mex$即可。我们可以树上每个点开一棵$trie$树来保存它所有后继状态的$SG$值。如果以$x$为根的子树中,$x$有一个子节点为$y$,当对以$x$为根的子树进行一次操作且操作点在以$y$为根的子树中,那么提供的后继状态就是$y$点$trie$树保存的所有$SG$值都分别异或上$x$其他所有子树的$SG$值。因此$trie$树需要完成的操作有$trie$树合并、整棵$trie$树异或一个值和取$mex$。

魔法小程序

 $solution$:多进制$FWT$(高维前缀和)

先考虑给出$b$数组求$c$数组,根据题目所给代码,就是将$0\sim b$数组长度$-1$这些数第$i$位按$a_{i}$进制表示,对于两个数$i$和$j$,如果$i$每一位($a$数组进制下)都大于等于$j$,那么$c_{i}$会加上$b_{j}$的贡献。我们对比$FWT$或卷积的正变换,可以发现这个就是正变换的一个扩展,对于每个数的第$i$位$x$只要不是$a_{i}-1$就可以将它的贡献加到$x+1$处。因为每一位循环节的长度不同,不能将数列在刚开始时就扩展到一定长度,所以注意每一位最后一部分的特殊处理。那么这道题给出$c$数组求$b$数组就将正变换变成逆变换就好了。

数据交互

 $solution$:动态DP

考虑两条链相交,其中一条链两端点的$LCA$一定在另一条链上。那么我们对每个点维护两个信息:$a_{x}$代表链的两端点的$LCA$为$x$的链权值和,$b_{x}$表示经过$x$但两端点不是$x$的链的权值和。对于三种操作:

1、插入一条链,将链上除两端点$LCA$之外所有点的$b$值加上$w$,将两端点的$LCA$的$a$值加上$w$。

2、删除一条链,相当于插入权值为$-w$的一条链。

3、查询,即找出一条链$(x,y)$使得链上所有点的$a$值$+LCA_{x,y}$的$b$值最大。

对于查询操作,可以将$(x,y)$这条链分成三部分:一段重链$(u,v)$、$u$轻儿子中$a$值和最大的一条链和$v$轻儿子中$a$值和最大的一条链(其中$u,v$可以相同,后两部分也可以没有)。

我们设每个点$x$轻儿子中$a$值和最大链的$a$值和为$g_{x}$,$(u,v)$段的$a$之和为$f_{u,v}$,那么答案就是$g_{u}+g_{v}+f_{u,v}+b_{u}$,对于每条重链来说就是最大连续子段和,只不过左端点权值为$g_{u}+b_{u}+a_{u}$,右端点权值为$g_{v}+a_{v}$。我们用一个可删除堆记录每条重链的最大值,最后取堆顶即可。现在考虑删除或加入一条链对答案的影响:虽然加入一条链会对链上除$LCA$外所有点的$b$值有影响,但每条重链的最大连续子段和只有左端点会用到$b$值,所以只要线段树上区间修改再下传标记即可,而修改$LCA$处的$a$值会对$LCA$到根的每个轻重链交接处的$g$值有影响,所以每次爬重链修改$g$的值并修改链上最大连续子段和即可。

如何优雅地求和

 $solution$:$NTT$

当$f(x)=1$时,$Q=\sum\limits_{i=0}^{n}C_{n}^{i}k^i(1-k)^{n-i}$,根据二项式定理可知这个式子结果为$1$。

当$f(x)=x$时,$Q=\sum\limits_{i=0}^{n}i\frac{n!}{i!(n-i)!}k^i(1-k)^{n-i}$

$Q=\sum\limits_{i=0}^{n}nk\frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i}$

$Q=nk\sum\limits_{i=0}^{n}\frac{(n-1)!}{(i-1)!(n-i)!}k^{i-1}(1-k)^{n-i}$

$Q=nk\sum\limits_{i=0}^{n}C_{n-1}^{i-1}k^{i-1}(1-k)^{n-i}$

根据二项式定理可知,$Q=nk$。

进一步可以发现当$f(x)=x^{\underline{d}}$时,$Q=n^{\underline{d}}k^{d}$。其中$x^{\underline{d}}$表示$x$的$d$次下降幂即$x(x-1)(x-2)...(x-d+1)$,也就是$\frac{x!}{(x-d)!}$。推导过程和上面类似。

$Q=\sum\limits_{i=0}^{n}i^{\underline{d}}\frac{n!}{i!(n-i)!}k^i(1-k)^{n-i}$

$Q=\sum\limits_{i=0}^{n}\frac{i!}{(i-d)!}\frac{n!}{i!(n-i)!}k^{i}(1-k)^{n-i}$

$Q=\sum\limits_{i=0}^{n}n^{\underline{d}}k^{d}\frac{(n-d)!}{(i-d)!(n-i)!}k^{i-d}(1-k)^{n-i}$

$Q=n^{\underline{d}}k^{d}\sum\limits_{i=0}^{n}C_{n-d}^{i-d}k^{i-d}(1-k)^{n-i}$

根据二项式定理,后面那个还等于$1$,所以$Q=n^{\underline{d}}k^{d}$。

因为$x^{\underline{i}}$的最高次幂是$x^i$,所以一个$m$次多项式可以写成$f(x)=\sum\limits_{i=0}^{m}a_{i}x^{\underline{i}}$。那么

$Q(f,n,x)=\sum\limits_{i=0}^{m}a_{i}*Q(x^{\underline{i}},n,k)=\sum\limits_{i=0}^{m}a_{i}*n^{\underline{i}}k^i$

现在考虑如何求$a_{i}$,设$a_{i}=\frac{b_{i}}{i!}$,那么$f(x)=\sum\limits_{i=0}^{m}b_{i}\frac{x^{\underline{i}}}{i!}=\sum\limits_{i=0}^{m}b_{i}C_{x}^{i}$

因为我们知道当$x=0,1,2...m$时$f(x)$的值,所以

当$x=0$时,$f(x)=b_{0}$

我们设$\Delta f(x)=f(x+1)-f(x)$(即一阶差分)。

因为$C_{x+1}^{i}-C_{x}^{i}=C_{x}^{i-1}$,所以$\Delta f(x)=\sum\limits_{i=0}^{m}b_{i}C_{x}^{i-1}$。

那么$\Delta f(0)=b_{1}$,由此可以推出$\Delta^{k}f(0)=b_{k}$(即$k$阶差分)。

至此可以得到一个$O(m^2)$的暴力差分做法(实际上是能$AC$的)。

但我们展开$k$阶差分的第一项(即$\Delta^{k}f(0)$)表达式可以发现:

$b_{k}=\sum\limits_{i=0}^{k}(-1)^{k-i}C_{k}^{i}f(i)$

$b_{k}=\sum\limits_{i=0}^{k}(-1)^{k-i}\frac{k!}{i!(k-i)!}f(i)$

$\frac{b_{k}}{k!}=a_{k}=\sum\limits_{i=0}^{k}\frac{(-1)^{k-i}}{(k-i)!}*\frac{f(i)}{i!}$

我们设$F(i)=\frac{f(i)}{i!},G(i)=\frac{(-1)^i}{i!},A(i)=a_{i}$

那么$A(i)=F(i)*G(i)$用$FFT$或$NTT$多项式乘法一下即可将时间复杂度降到$O(mlog_{m})$。

石家庄的工人阶级队伍比较坚强

 $solution$:三进制$FWT$

首先因为每个人的决策是固定的,所以转移关系也是恒定的,我们设它是一个矩阵$B$,其中$B_{i,j}$表示$i$与$j$游戏时$i$获得的分数。那么要求的就是$f_{n}=f_{0}B^n$。
我们定义三进制不进位加法为$\oplus$,不退位减法为$\ominus$,他们互为逆运算(与二进制下的异或类似)。
那么对于$\forall k<3^m,B_{i,j}=B_{i\oplus k,j\oplus k}$,同理$B_{i,j}=B_{i\ominus j,0}$。而这个结论也可以推广到$B^n$,即$\forall k<3^m,B_{i,j}^{n}=b_{i\ominus j,0}^{n}$。
那么$f_{n,i}=\sum\limits_{k=0}^{3^m-1}f_{0,k}B_{k,i}^n=\sum\limits_{k=0}^{3^m-1}f_{0,k}B_{0,i\ominus k}^n=\sum\limits_{x\oplus y=i}f_{0,x}B_{0,y}^n$
所以,我们只需要$B$矩阵的第一行就够了,又因为
$B_{0,i}^n=\sum\limits_{k=0}^{3^m-1}B_{0,k}^{n-1}B_{k,i}=\sum\limits_{k=0}^{3^m-1}B_{0,k}^{n-1}B_{0,i\ominus k}=\sum\limits_{x\oplus y=i}B_{0,x}^{n-1}B_{0,y}$
所以只需要将$B_{0}$做$n$次卷积然后和$f_{0}$做一次卷积即可得到答案。
也就是说我们需要找到一个三进制不进位加法卷积,这种模意义下的卷积也叫循环卷积。
其实在我们熟悉的卷积中就有类似的存在——FWT的异或卷积
可以发现FWT异或卷积实际上就是二进制不进位加法卷积。
我们先来研究一下FWT异或卷积:
设$bitcount(i)$表示$i$二进制中$1$的个数。
因为$bitcount(i\&k)$的奇偶性异或$bitcount(j\&k)$的奇偶性等于$bitcount((i\oplus j)\&k)$的奇偶性
那么我们就可以构造出正变换$F(k)=\sum(-1)^{bitcount(i\&k)}f(i)$
可以发现上述式子中的$bitcount(i)$也就是$i$的二进制每一位数的和,而$\&$就是二进制下的不进位乘法、$\oplus$是二进制下不进位加法
那么我们同样可以将这些扩展到三进制中,即$bitcount_{3}(i)$表示$i$的三进制每一位数的和、$\&_{3}$表示三进制下的不进位乘法、$\oplus_{3}$表示三进制下的不进位加法
而上述结论在三进制下也依旧成立
即$(bitcount_{3}(i\&_{3}k)\%3)\oplus_{3}(bitcount_{3}(i\&_{3}k)\%3)=bitcount((i\oplus_{3}j)\&_{3}k)$
那么现在只需要找到一个能代替上式中$-1$的数就能完成这个三进制不进位加法卷积了,而这个数$w$要满足$w^{i}=w^{i\%3}$,所以只要用三次单位根就行了($FWT$中的$-1$也就是二次单位根)!
这里为了方便可以将所有复数都表示成$a+bw$,因为$w^2+w+1=0$,所以$w^2=-w-1$。
对于两个复数相乘就是$(a+bw)*(c+dw)=ac+(bc+ad)w+bd(-w-1)=(ac-bd)+(ad+bc-bd)w$
因为最后要乘上$3^m$的逆元,所以要求$3^m$与$p$互质。
假设$p$有$3$这个质因子且$k=\frac{p}{3}$,那么$\frac{1}{k+1}+\frac{1}{k(k+1)}=\frac{1}{k}=\frac{3}{p}$,与题面矛盾,因此保证了$3^m$有逆元。

你的生命已如风中残烛

 $solution$:组合数

 总方案数显然是$(m+1)!$即$m+1$个数的全排列,我们先不考虑强制固定最后一张牌的方案。将每一张牌给出一个权值表示抽到这张牌能获得的再摸牌的次数,显然普通牌的权值是$-1$,而特殊牌的权值是$w_{i}-1$,因为第一张牌抽取时不耗费摸牌次数,所以第一张牌的权值是$w_{i}$。那么求出每个位置$i$的前缀和即可表示抽完前$i$张牌后还剩的摸牌次数。显然如果一种排列合法最后一个位置(即$m+1$)的前缀和为$0$且之前每个位置的前缀和都大于$0$。那么对于一种合法排列如果将前面任意多张牌拿到最后,拿走部分的和是大于$0$的(设为$x$),那么没被移动的这些位置的前缀和就都要减$x$,没移动之前的最后一个位置的前缀和就是$-x<0$,即一定是不合法的。而对于任意一种排列,一定存在一个前缀和最小且最右的位置,对于这个位置之后的部分单独来看(即去掉这个位置及之前的部分)每个位置的前缀和一定大于0,所以只要把这个位置之后的部分拿到排列的最前面就能构造出这种排列循环同构的$(m+1)$种排列中合法的那种。所以可以得出结论对于循环同构的$m+1$个排列有且只有一个排列是合法的。合法的方案数就是$\frac{(m+1)!}{m+1}$即$m!$,而在这些合法的情况中被固定的那最后一张牌可能在普通牌的$(m+1-n)$个位置中的任意一个且在每个位置的方案数相同,所以最后的答案就是$\frac{m!}{m+1-n}$。

温暖会指引我们前行

 $solution$:$LCT$+最大生成树

根据题意可知查询路径要求路径上边权都尽可能大,那么被查询的路径就一定是最大生成树上的边。因为动态加边,所以用$LCT$维护最大生成树即可。维护边的信息只需要将每条边看作$LCT$上的一个点即可。

组合数问题

 $solution$:$Lucas$定理+数位$DP$+容斥

根据$Lucas$定理可以知道在给定的质数模数$p$下对于一个组合数$C_{n}^{m}$,将$n$和$m$都用$p$进制表示,这个组合数不等于$0$当且仅当$n$的每一位都不小于$m$的对应位。而本题要求等于$0$的组合数个数只需要用总个数-不等于$0$的个数即可。对于不等于的个数只需要数位$DP$即可,$f[i][0/1/2/3]$表示对于$n$和$m$在$p$进制下最高的$i$位中$n,m$都没到达上界/$n$到达上界/$m$到达上界/$n,m$都到达上界的方案数。

汽水

 $solution$:二分答案+点分治+分数规划

题目要求$|\frac{\sum_{w_{i}}}{num}-k|$的值尽量小(其中$num$为边数),即$|\frac{\sum_{w_{i}-k}}{num}|$尽量小,$w_{i}-k$可以在输入时就将$k$减掉。我们二分一个答案然后判断是否有可行路径,即判断是否有路径满足$-ans\le \frac{\sum_{w_{i}}}{num}\le ans$。用点分治来求可行路径,对于每个分治中心,求出分治联通块中每个点的深度$dep_{i}$和到分治中心边的数量$num_{i}$。原式可变为$-ans\le \frac{dep_{1}+dep_{2}}{num_{1}+num_{2}}\le ans$,显然当$0\le dep_{1}+dep_{2}$时要满足$\frac{dep_{1}+dep_{2}}{num_{1}+num_{2}}\le ans$,否则要满足$-ans\le \frac{dep_{1}+dep_{2}}{num_{1}+num_{2}}$。我们以$0\le dep_{1}+dep_{2}$为例,由上式可得$dep_{1}-ans*num_{1}\le ans*num_{2}-dep_{2}$,将所有点按$dep$从小到大排序,从左枚举每个点然后在右边向左移动指针表示指针右边的点的$dep$与当前枚举点的$dep$和都大于$0$。记录指针右边点中$ans*num-dep$的最大值,但因为最大值的那个点与当前枚举点可能属于分治重心的同一棵子树,所以要再维护与最大值的点分属不同子树的次大值。另一种情况同理即可。

posted @ 2019-04-17 21:01  The_Virtuoso  阅读(391)  评论(0编辑  收藏  举报