好题总结 PartII
#36. 【清华集训2014】玛里苟斯
首先需要发现的是,只有这些数的基有用,这是应为如果存在某一个数$a_i$,使得存在不包含$a_i$的一个集合$S$,其异或和等于$a_i$
那么对于$S$的任意一个子集$T$所得到的异或和,都可以通过取$T$在$S$中补集,在异或$a_i$得到一个相同的值,那么每一个值就有两种方案,由于求期望,计算的时候会把这个因子$2$约掉,那么去掉$a_i$不影响答案
由于题目保证了答案不大于$2^{63}$,$a$中数的上界为$2^{\frac{63}{k}}$,可以发现如果$k\geq 3$,线性基中元素的个数最多只有$21$个,那么直接暴力统计答案,并且这道题有一个性质是,答案要么是整数,要么是$.5$,这个可以从下面的证明看出来
那么现在只要考虑$k=1,k=2$的情况
当$k=1$时,可以单独考虑每一位上的贡献,对于第$i$位上存在$m(m\neq 0)$个$1$,其期望贡献为$\frac{2^m\sum\limits_{i=0}^{m}[i\%2=1]\binom{m}{i}}{2^m}$,等于$2^{m-1}$
当$k=2$时,由于是乘积,那么只要考虑某两位上乘积的和,对于第$i$位和第$j$位,如果所有数都是$11$或者$00$,那么这就退化成$k=1$的情况,贡献为$2^{i+j-1}$
否则,记$11$的有$a$个,$01$有$b$个,$10$有$c$个,所有不为$00$的个数有$a+b+c$个,那么贡献为
$\frac{\sum\limits_{k=0}^a\binom{a}{k}\sum\limits_{i=0}^b\sum\limits_{j=0}^b[i\%2=k\%2][i\%2=k\%2]\binom{a}{i}\binom{b}{j}}{2^{a+b+c}}$
化简可得$2^{a+b+c-2}$
那么直接暴力即可
#62. 【UR #5】怎样跑得更快
居然做出了UR的C
首先这个解方程显然不能直接去高斯消元,这个矩阵一定有一些性质,再观察这个式子,一脸莫比乌斯反演的样子,再想到一定反演变化实际上就是矩阵互相求逆的过程,说白就是解方程的过程,那么以这个为指导思想,那么来考虑怎么具体做这道题
首先式子里的$lcm(i,j)^d$改写为$\frac{i^dj^d}{gcd(i,j)^d}$,原式化为$i^d\sum\limits_{j=1}^n gcd(i,j)^{c-d}j^d x_j\equiv b_i$
令$b'_i=\frac{b_i}{i^d}$,然后开始大力推式子
$\sum\limits_{g|i}g^{c-d}\sum\limits_{j}^{\left \lfloor \frac{n}{g} \right \rfloor}[gcd(\frac{i}{g},j)=1] (jg)^d x_{jg}$
$\sum\limits_{g|i}g^{c-d}\sum\limits_{j}^{\left \lfloor \frac{n}{g} \right \rfloor}(jg)^d x_{jg}\sum\limits_{k|\frac{i}{g}}\mu (k) $
$\sum\limits_{g|i}g^{c-d}\sum\limits_{k|\frac{i}{g}}\mu (k) \sum\limits_{j}^{\left \lfloor \frac{n}{kg} \right \rfloor}(kgj)^d x_{kgj}$
$\sum\limits_{t|i} (\sum\limits_{j=1}^{\left \lfloor \frac{n}{t} \right \rfloor}(tj)^dx_{tj})(\sum\limits_{g|t}g^{c-d}\mu(\frac{t}{g}))$
令$C_t=(\sum\limits_{g|t}g^{c-d}\mu(\frac{t}{g})),f(t)=\sum\limits_{j=1}^{\left \lfloor \frac{n}{t} \right \rfloor}(tj)^dx_{tj}$
那么莫比乌斯反演可得
$C_if(i)=\sum\limits_{t|i}\mu(t) b_{\frac{i}{t}}$
预处理$C$和$\mu$,那么就可以在$O(nlogn)$时间内得到$f$,然后从后往前解出每一个$x$(注意需要除以$i^d$),最后带回原式判断是否无解
#345. 【清华集训2017】榕树之心
首先考虑判断根是否合法,对于根节点$x$来说,可以使根节点的两个子树内互相抵消,经典结论,当所有子树最大值$MAX$,使得$2MAX\leq (sz[x]-1-sz[son])$时可以全部抵消掉,最终剩下$(sz[x]-1)\%2$,加上自己$x$一个,否则会剩下$2MAX-(sz[x]-1-sz[son])$个点
那么我们就要尽量消掉重儿子子树内的节点,那么可以设dp[x]表示在x子树内最少可以消到$dp[x]$个节点,考虑转移,根据上面的结论,那么只要$2dp[x]\leq (sz[x]-1-sz[son])$就可以进入第一种情况
因为贪心地想,只要可以得到重儿子子树内节点最小值是满足条件的,虽然有可能在取最小值的时候,不一定满足是所有子树的最大值但是可以通过调整来满足条件
那么直接$DP$到根,判断$dp[1]$是否为$1$,如果为$1$那么可行,否则不可行
接下来考虑如何判断其他节点是否可行,可以利用之前记录的信息,从上往下$DP$,记录到当前节点,子树外最少可以消到多少个,按照之前的做法类似换根$DP$即可
#346. 【清华集训2017】某位歌姬的故事
首先可以发现有效的数段只有$2q$个,那么可以把每一个限制的左右端点离散化,然后可以得到$2q$个连续的区间,并且可以发现每一个连续的区间可以填的数的上界是相同的,上界就是所有覆盖这一点限制$m$的最小值
考虑如果只有一个限制的时候,方案数可以简单容斥计算,就是$m^{r-l+1}-(m-1)^{r-l+1}$,那么考虑多个限制的时候,就可以容斥地计算,即$\sum\limits_S (-1)^{|S|} f(S)$,其中$f(S)$表示强制满足$S$集合中限制条件的,其他的条件不满足的方案数,记$x\in S$的所有线段的并的长度为$a$,$x \notin S$所有线段的并长度为$b$,那么$f(S)=m^a+(m-1)^b$,那么这个可以用$DP$解决
设$dp[i][j]$表示到第$i$个区间,所选的区间最远到达$j$的容斥计算结果之和,注意需要把$-1$乘入到结果中
转移如下
$dp[i][j]\rightarrow dp[i+1][j]$
$-g(l[i],r[i],j)dp[i][j]\rightarrow dp[i+1][max(j,r[i])]$
$g(l,r,i)$表示$[l,r]$这个区间与长度为$i$前缀扩展的方案数,也就是讨论一下左右端点$l,r$与$i$的大小关系,利用上面计算容斥系数的算法计算即可
注意到任意一个线段只会出现在点的上界为$m$的区域中,那么可以对于上界相同的点单独考虑,算出容斥系数,将所有的容斥系数相乘起来,就是答案
需要特判某一个限制一定不会被满足的情况,并且需要注意常数,要预处理幂次,否则会在extra test被卡
说白了也不是很复杂
「ICPC World Finals 2019」交通堵塞 Traffic Blights
记$m_i=r_i+g_i$,$m_i$就是一个周期,考虑一种简单的情况,如果所有$m_i$都互质,那么所有红绿灯的周期为$\prod m_i$,根据$CRT$可以知道,对于某一个红绿灯,其概率都是独立的,这是因为所有在解同余方程组的时候任意设系数都是可以解出唯一解,那么无论之前走过哪些路口,其能走过的概率都是一定的,那么只要将每一个路口能够通过的概率累乘起来统计即可
再考虑如果有$m_i=m_j$的情况,那么只要记录一下到当前点,$m_i$个时刻中哪些已经被红灯堵住了,然后算出可以通过的概率
如果存在$m_i|m_j$的情况,那么将所有可以两两整除的周期变成其中最大的周期,然后将红灯的时间也相应的标记,然后用上面的做法
现在再考虑缩小剩余系,考虑取一个数$X$,然后枚举时间$c$,模$X$意义下,那么相当于就是枚举$c,c+X,c+2X...$这些时刻,考虑原来红绿灯的周期为$m_i$,那么现在的周期为$\frac{m_i}{\gcd(m_i,X)}$,那么如果可以使当前这些周期两两互质或者存在倍数关系,那么就是对于一个初始时间$c$,计算相应的概率,将所有初始时间累计出来,除以$X$即可(因为从任意一个时刻出发都是等概率的)
那么得到的周期应该都是$1$或者某一个质数的若干次方,那么可以计算得$X=2520$
CF1368F Lamps on a Circle
首先可以发现只要第二个人不是选择的区间不是所有都是开着的灯,那么当前答案一定会变大,那么如果当前操作开灯的个数是$k$,那么最长的一段连续开启的灯个数最大为$k-1$,那么最优情况一定是每$k$盏灯中有一个灯是灭的,其他的所有灯都是亮的,并且连续
那么只要将原来$n$个灯,每$k$个分一组,强制将最后一盏灯不选,并且第$n$盏灯不选,需要注意的是某一组一定会被第二个人全部关掉,那么可以直接暴力枚举$k$,进行模拟判断
还有一种直接理论分析的,判定$k=\sqrt(n)$时,$R$达到上界,具体见官方题解
[USACO17OPEN]Switch Grass P
首先需要发现的是,答案一定是某一条边的权值,并且这条边一定在这张图的最小生成树上
因为所有非树边所形成的环上,该非树边一定是最大的,如果是选取这条非树边最优的话,那么这个环上所有点的颜色都是相同的,那么就会导出矛盾,非树边链接的两个点是同色的,那么不能选这条边
这道题到这里就差不多结束了
那么可以用一个优先队列维护每一条边,并且采用延迟删除的方法,然后对于每一个树上的点,用$map$套一个$set$维护儿子节点颜色的最小值,在修改的时候只要在这个节点加入与当前未修改之前颜色的最大值,然后在其父亲处进行修改,加入最大值
「LibreOJ Round #6」花札
首先可以将所有可以连续出牌的一对牌连一条边,那么连出的图一定是一张二分图,那么问题就变成了从二分图某一个顶点出发沿边两个人轮流走,不能重复走过相同的点,最后不能走的人输,问先手是否有必胜策略
这是一个经典的问题Undirected Vertex Geography
就是先手必胜的充分必要条件是,起点$v$一定在该二分图所有最大匹配的交集上
那么一个朴素想法就是直接将所有边暴力连出来,然后跑二分图匹配,显然复杂度不能承受,由于二分图匹配可以使用网络流,那么考虑用网络流上优化建图,显然如果对于将每一种点数和颜色都单独建出一个点,然后将牌连向对应的点数和颜色,那么现在的图就是$3$层的图,跑出的最大流就是原图的某一个最大匹配
现在考虑如何求出这张图上所有最大匹配的交集,可以发现的是如果某一个点属于这个交集,那么在图中删去这个点,跑出的最大流一定会变小并且一定在当前最大匹配中,否则不变。如果某一个点删去之后最大流不变,由于二分图的性质(优化建图后本质上还是一个二分图),只要找出一个长度为偶数的交替路,那么这个点$x$删去之后最大流不变,考虑在残量网络上考虑,由于这个点在最大流上,一定存在这个点到源点$s$的路径,那么如果存在一条$s$到$x$的路径,那么说明在原二分图上找到了一个偶数的交替路
必要性证明类似
那么某一个点$x$属于所有最大匹配交集的充分必要条件就是在残量网络上不存在一条从$s$到$x$的路径
SRM 304 Div 1 TheXGame
首先需要考虑将连续的'-'段看作$nim$游戏中的一堆石子,那么每一次操作相当于是将某一堆石子分裂成两堆石子,那么考虑模仿$nim$游戏,算其异或和,由于第一次选择很特殊,没有价值,那么我们猜后手必胜的条件是异或和为$0$,并且如果当前的系数为$c$,当前总石子数为$n$,后手比先手多胜至少$\frac{nc}{2}$
分两种情况分析,归纳证明:
1.如果当前只剩最后两步,那么由于保证异或和为$0$,那么两堆石子数量均为$\frac{n}{2}$,那么后手胜过先手恰好$\frac{nc}{2}$
2.设当前石子先手拿完之后还剩$y$个,后手拿了$x$个,那么接下来后手会胜过先手$2(y-x)c$,先手本轮得分$(n-y)c$,后手本轮得分$2xc$,那么后手胜过先手$3yc-nc$,那么先手会使$y$尽可能小,由于异或和为$0$,那么最高位至少有$2$个$1$,那么$y$最小为$\frac{n}{2}$,那么后手至少胜$\frac{nc}{2}$
之后需要证明的是先手操作过后,后手可以一直保证异或和为$0$,如果把一堆石子数为$a$的分裂成$b,c$,那么相当于是从中拿走了$a-b\bigotimes c$个石子,那么类似与$nim$的证明
那么只要枚举拿走的区间,然后用异或和判断是否为$0$即可
CF878D Magic Breeding
看到操作三首先可以考虑枚举答案,由于最终这个属性大小是唯一确定的,那么我们需要将判断的条件放宽,由于组成新生物的集合都是$k$个生物中的一个子集$S$,那么这个属性一定是来自这个$S$中的某一个生物$x$,那么考虑将条件放宽至所有令所有包含这个生物$x$的子集在判断的时候都是合法的
这是这道题的指导思想,然后考虑具体实现,注意如果在二进制下,取$min/max$是分别对应着与/或运算,考虑设$dp[x][S]$表示在第$x$个生物中$k$个生物的子集为$S$时,是否存在一种可能使得第$x$个生物的属性是小于等于$S$中可能存在的属性(其实就是在放宽条件)
那么对于$1\leq i\leq k$的生物,$dp[i][S]=1$的条件就是$i\in S$
那么对于$1$操作,设新的生物为$now$,$dp[now][S]=dp[x][S]\&dp[y][S]$,$2$操作同理,运算为或
对于询问就是,从小到大枚举$k$个生物中$y$项的属性,不断加入集合中,一旦出现合法情况,那么答案就是当前的生物的$y$项属性(这个是由于保证了任何包含$x$的集合都是判作合法)
「LibreOJ NOI Round #2」不等关系
考虑容斥,首先考虑如果同时存在两种限制是很难处理,首先考虑不存在某一种限制的情况,比如说先不考虑"$>$"
那么$>$左右两边的数大小关系不限制,那么两个之间的数只有$<$,那么这一段数一定要单调递增,那么$>$就相当于一个隔板,将序列划分成若干段,每一段都是单调递增的序列,设序列长度为$a_i$,总共划分成$m$段
那么方案数为$\frac{n!}{\sum\limits_{i=1}^m a[i]!}$
再考虑把所有$>$的限制加上,由于刚才计算的是两面的方案数,那么考虑将$>$改为$<$的限制,然后进行容斥
设$dp[i]$表示考虑到原串的第$i$位,去掉$n!$的容斥系数之和,如果$s[i]=>$,那么$dp[i]\neq 0$,否则$dp[i]=0$
$dp[i]=\sum\limits_{j=0}^{i-1} (-1)^{cnt_i-cnt_j-1}dp[j]\frac{1}{(i-j)!}$
分治$ntt$即可
CF757E Bash Plays with Functions
我怕不是傻了
Solution1:
$f_0(x)=2^{g(n)}$,其中$g(n)$表示$n$有多少个不同的质因子
$f_r(n)=\sum\limits_{d|n} f_{r-1}(d)$
那么最终$f_r(n)=\sum\limits_{d|n} F(r,n,d)f_0(d)$
其中$F(r,n,d)$就是接下来要算的系数
若$n=p_1^{R_1}p_2^{R_2}...p_k^{R_k}$,记$(R_1,R_2,...,R_k)$来表示$n$
假设当前的$d$可以表示为$(R_1',R_2',...,R_k')$,$\forall i\in[1,k],R_i'\leq R_i$
注意到在r不断减小的过程中,$d$只会减小,相当于问题转化为当前有$r$次操作,每一次操作可以给当前的数乘上若干质因数,问有多少种方案使得$r$次操作过后,当前的数变成$n$
可以发现每一个质因数都是独立的,只要最后将方案相乘即可,对于单独的某一个质因数,方案数相当于$r$个不同的盒子有$R_i-R_i'$个相同的球,盒子可空,问有多少种方案,插板法即可,记$h[k]$表示结果
但显然我们不能枚举每一个其因数,那么考虑$DP$,设$f[i][j]$表示前i种质因数,$R_i-R_i'$之和为j的贡献总和,在转移的时候需要将$f_0$同时统计进去
$f[i][j]=\sum\limits_{k}(1+[k\neq R_i])f[i-1][j-k]h[k]$
Solution2:
$f_0$其实是一个积性函数,证明显然
由转移式可以知道,$f_r$是$f_{r-1}$与$I$狄利克雷卷积的结果,也是积性函数
$n=p_1^{R_1}p_2^{R_2}...p_k^{R_k}$
$f_r(n)=\prod\limits_{i=1}^{k} f_r(p_i^{R_i})$
$f_r(p_i^{R_i})=\sum\limits_{k=0}^{R_i} f_{r-1}(p_i^{k})$
前缀和优化即可
还有,对于询问$10^6$次,值域$10^6$的分解质因数,可以利用线性筛筛出来的最大素因子来快速分解
CF582C Superior Periodic Subarrays
又是一道把我卡死的数论题
首先考虑长度为$s$的子串,其周期是$\frac{n}{gcd(n,s)}$,考虑在周期内会经过哪些点
列出同余方程$ks\equiv id$改同余为等号$ks+nx=id$,那么方程有解的条件为$gcd(s,n)|id$
那么如果在子串内出现第$i$号位置,那么$i$会经过的位置$j$满足$i\equiv j(mod\ gcd(s,n))$(完美错失重要结论),那么$a_i$就是这些中最大的
考虑枚举$n$的因数,对于每一个同余结果统计最大的数及其位置,那么可以通过计算后缀和统计出贡献,这部分简单
SRM 560 DrawingPointsDivOne
挺妙一题
考虑正向过程,对于初始图,如果存在一个$k*k$的矩阵,那么经过$k$次操作之后一定会得到一个点
那么由此可以推出,对于判断当前点集可以进行k次逆向操作的条件是,将每一个点替换成k*k的矩阵,得到新图上只能划分出n个$k*k$的矩阵
那么显然可以二分答案,但是二分上界还待确定
结论是二分上界为$140$,考虑证明
对于从一种合法情况变成到一种不合法情况,其之间一定存在原来两个不相邻的矩阵,现在相交了,那么这样会产生多余的矩阵
那么再考虑如果不存在新增矩阵相交的情况,考虑一个残缺的$k*k$矩阵,当$k$增大一时,原来缺口上的点集向外扩展$1$,矩阵的边界也扩展$1$,那么原来缺口到矩阵边界的距离不变,这个缺口就不会补上
那么只要矩阵扩展到不会再相交的时候就是二分上界,显然为点集某一维坐标极差
为了实现方便,可以将$1*1$矩阵生成的点移动到矩阵的左下角,显然不影响答案