退役前的做题记录3.0
退役前的做题记录3.0
好久没有更过博了呢。
总不能一直这么咕下去吧。
那就写点最近做过的题的题解吧。
如果需要代码的话可以去OJ上翻或者直接私信我保证及时回复
[UOJ450][集训队作业2018]复读机
给一个长为n的序列染色,每个位置可以染k种颜色中的一种,要求每种颜色的出现次数为d的倍数,求方案数模19491001。
构造指数生成函数f(x)=∑ni=01i!xi[d|i],答案就是fk(x)的n次项系数乘上n!。
根据单位根反演有[d|i]=1d∑d−1j=0ωijd,所以有f(x)=∑ni=01i!xi∑d−1j=0ωijdd=1d∑d−1i=0exωid。
那么fk(x)=1dk(∑d−1i=0exωid)k,大力二项式定理展开,枚举a0,a1...ad−1∈[0,k],∑d−1i=0ai=k,该部分贡献的答案为k!∏d−1i=0ai!(∑d−1i=0aiωid)n。
时间复杂度O(kd−1logn)。
[BZOJ3328]PYXFIB
设A=[1110]为斐波那契数列的转移矩阵
所以直接矩阵快速幂即可,复杂度O(klogn)。
[UOJ453][集训队作业2018]围绕着我们的圆环
如果做过原题的话会发现答案只与C的秩有关。现在需要考虑的就是线性基的动态删除问题。
对线性基中的每个向量维护它是由原本的那些向量组成的,删除向量x时先找到包含x的一个零向量,将其异或到其他所有包含x的向量上(不会改变数值,但是改变了向量组成)再直接删除即可。若不存在包含x的零向量,则删除x势必会导致秩减小,找到包含x的最低位向量,同样异或到其他所有包含x的向量上即可。复杂度O(n3ω)。
[BZOJ3600]没有人的算术
建立以大小为关键字的重量平衡树,再按照中序遍历的顺序分别分配[0,1]的权值,这样就可以实现O(1)比较两个数的大小。
考虑新插入一个数怎么处理。因为新插入一个数时,组成它的那两个数的大小已经比较好了,所以可以对每个数记一个pair表示它是由哪两个数组成的,前一个视作第一关键字后一个视作第二关键字比较即可。最后还需要用线段树维护一下区间最小值的位置。
[BZOJ3682]Phorni
后缀平衡树模板题。
考虑插入一个新的后缀时,比它少一个字符的那个后缀已经比较过了。所以可以把当前位字符作为第一关键字,下一位后缀的大小作为第二关键字比较。同样需要用一棵线段树维护一下询问的答案。
[BZOJ4768]2555加强版之wxh loves substring
建立后缀平衡树,查询串s时,只需要查有多少后缀字典序小于s,有多少后缀字典序小于s+一极大字符,两者答案相减即可。由于树高logn,所以可以暴力比较字典序,复杂度O(∑|s|logn)。
[BZOJ5104]Fib数列
斐波那契数列的通项公式fn=1√5[(1+√52)n−(1−√52)n],其中5在模109+9下存在二次剩余。简化一下问题,我们相当于需要求满足An−Bn=C的最小n值。
这个问题好像做不了,但是发现AB=−1,所以就有An±1An=C,±是因为需要讨论n的奇偶性。
发现就是解一个二次方程,需要用二次剩余解出√Δ从而解出An,然后直接BSGS即可。
在这里写一下二次剩余的求法。规范一下,这里求x2≡nmodp的一个解x,其中p是一个奇质数。
以下所有运算默认在模p意义下进行。
一个数n存在二次剩余的条件是np−12=1,正确性显然。以下的两种做法都需要先判掉无解。
有一种O(√n)求二次剩余的方法,就是先求出p的原根g,那么只需要用BSGS求出ga=n的a,答案就是ga2。
还有一种做法,先随机一个a使得a2−n不存在二次剩余,这里的概率为12所以期望次数为2。
定义ω=√a2−n。
因为定义了a2−n不存在二次剩余,因此ωp−1=(a2−n)p−12=−1。
那么就会有(a+ω)p=a−ω,证明可以根据二项式定理展开,会发现除了ap与ωp项外其余项都一定是p的倍数,又因为ap=a,ωp=−ω,故成立。
因为(a+ω)p+1=(a+ω)(a−ω)=a2−ω2=n,所以我们就只需要求(a+ω)p+12就是答案了。
现在证明一下(a+ω)p+12中不含有ω项。设(a+ω)p+12=x+yω,因为(x+yω)2=n,所以x=0或y=0。
当x=0时,y2(a2−n)=n,由于a2−n不存在二次剩余,y2显然存在二次剩余,而n存在二次剩余,故矛盾。y=0得证。
[BZOJ3168][HEOI2013]钙铁锌硒维生素
矩阵乘法中A×B=C,可以发现C的列向量全部处于A的列向量所能够线性组成的空间里。所以只需要对于每个C的列向量求出参与组成它的A中列向量集合,然后做个二分图匹配即可。
上面要求的东西其实就是矩阵B,所以直接矩阵求逆就行了。
求逆的方法也很简单,对C做线性变换使其变成单位矩阵,然后再用一个矩阵记录一下变换,这个记录变换的矩阵就是C的逆矩阵了。复杂度O(n3)。
题目要求二分图最小字典序匹配。倒着做是错的,原因是只保证了第一位的字典序最小而没有保证在第一位字典序最小的前提下第二位最小。正确的做法是先求出一组任意解,然后在从小到大依次确定匹配,标号大的点不能改动标号小的点的匹配。
[Luogu4707]重返现世
普通的min容斥的式子很简单,即\max_S=\sum_{T\subseteq S}(-1)^{|T|-1}\min_T。
证明的话,只需要考虑第x大元素的被计算次数\sum_{i=1}^x(-1)^{i-1}\binom{x-1}{i-1}=(1-1)^{x-1}=[x=1]。
现在考虑求kth\min-\max容斥,即求集合中第k大元素。
设kth\max_S=\sum_{T\subseteq S}f(|T|)\min_T。我们现在需要求出容斥系数f(x)。
根据定义,\sum_{i=1}^xf(i)\binom{x-1}{i-1}=[x=k]。
二项式反演得f(x)=\sum_{i=1}^x(-1)^{x-i}\binom{x-1}{i-1}[i==k]=(-1)^{x-k}\binom{x-1}{k-1}。
在这道题中枚举集合S,显然\min_S=\frac{m}{\sum_{i\in S}p_i}。朴素dp的话直接记录f_{i,j,k}表示前i个数中选个j个\sum p_i=k的方案数,复杂度O(n^2m)。注意到这里|n-k|\le10,可以考虑组合数的递推式\binom nm=\binom{n-1}{m}+\binom{n-1}{m-1},分别计算出每个k'\in[1,k]的答案,可以做到O(nm(n-k))。
[CF1096G]Lucky Tickets
不是直接构造生成函数求f^{\frac n2}(x)就行了?
注意998244353这个模数下NTT的最长有效长度是8388608。
[BZOJ5219][Lydsy2017省队十连测]最长路径
求一张n点竞赛图从1号点出发能到达恰好i个点的边定向方案数。
一张竞赛图缩点后是一条拓扑序唯一的链。所以从1号点出发能够到达的点集就是1号点所在的强连通分量加上它后面的所有强连通分量。
设g_i表示i点竞赛图的个数,显然g_i=2^{\binom i2}。设f_i表示i点强连通竞赛图的个数,枚举非强连通时拓扑序最小的强连通分量的大小,f_i=g_i-\sum_{j=1}^{i-1}\binom ijf_jg_{i-j}。
求从1号点出发能到达恰好i个点的方案数,可以枚举1号点所在的强连通分量大小j,贡献为\frac{(n-1)!}{(j-1)!(i-j)!(n-i)!}f_jg_{i-j}g_{n-i}。
以上的所有应该都可以做到O(n\log n)。
[CF1096E]The Top Scorer
有p个人,1号的分数至少是r,所有人的总分数是s,定义获胜的人是分数最高的所有人中等概率随机一个。求1号获胜的概率。p\le100, r\le s\le 5000。
这个数据范围就很灵性,估计出题人就是想给O(p^2s)。
先O(s)枚举1号的实际分数,再O(p)枚举有多少人分数跟他一样高。现在问题就变成了把剩下的分数分配给剩下的人,每个人的分数不得超过k的方案数。枚举强制多少个人超过,xjb容斥一下就可以了,这里算一次的复杂度是O(p)。最后除以总方案数,就是把s-r个球放进p个盒子里的方案数。
其实可以把完整的式子写出来然后划一划之类的。在Codeforces上看到有人O(p)的做法过了。
[CF1096F]Inversion Expectation
给你不完整的排列,你会随机把这个排列补满,求期望逆序对数。n \le 2\times10^5。
把产生的逆序对分为三类。
第一类是两个数都是你自己填的。记有s个位置不确定,那么\binom s2对每对产生的概率都是\frac12,故贡献为\frac{s(s-1)}{4}。
第二类是一个数是原来确定的一个数是你自己填的。先只考虑小的那个(下标靠后)是原来确定的而大的那个是你自己填的这个情况。枚举每一个确定的数,设它前面有x个可以填的位置,有y个可以填的数比它大,那么产生的贡献就是\frac{xy}{s}。另一种情况同理。
上面两类的计算都根据的是期望的线性性。期望的线性性指的是和的期望等于期望的和,即使拆分成的若干部分是相互关联的。
第三类是两个数都是原来确定的,直接树状数组统计就行了。
[Luogu4581][BJOI2014]想法
随机化。k个[0,m]的随机变量中,最小值的期望为\frac{m}{k+1}。
对每个想法随机一个权值。对每道题求出它涉及到的想法中权值的最小值,就大致可以知道它涉及的想法的数量。每做一次复杂度O(n+m),多做几次差不多就行了。
[HDU5503]EarthCup
一种做法是暴力网络流,左边\binom n2个点流量为1,右边n个点流量为a_i,判断是否满流即可。
把第i个点拆成a_i个,相当于是问左右各\binom n2个点的二分图是否存在完美匹配。Hall定理。
将a_i从大到小排序,记s_i表示前i大的a_i值之和,需要满足s_i \le \binom n2 - \binom {n-i}2。
或者是将a_i从小到大排序,记s_i表示前i小的a_i值之和,需要满足s_i \ge \binom i2。
两种做法显然是等价的。
[BZOJ3925][ZJOI2015]地震后的幻想乡
直观的想法是对于i\in[n-1,m]求出恰好在加入i条边后图连通的方案数再乘上\frac{i}{m+1}。
把上面那个i乘到式子里面去,转化一下后会发现我们要求的东西变成了对于i\in[1,m]求出在加入至少i条边后图连通的概率。这个东西等价于加入恰好i条边后图不连通的概率。接下来的内容就完全和权值没有关系了。
设f_{s,i,0/1}表示选出点集s的导出子图中的i条边,s这个集合连通/不连通的概率。转移只需要固定一个点,枚举它所在的连通块就行了。复杂度大概是O(3^nm^2)的。
[BZOJ3142][HNOI2013]数列
要求的东西是
拆开分别算。前一项就是n\times m^{k-1},后一项可以考虑某一个i_j,算出来是(k-1)\times\frac{m(m+1)}{2}\times m^{k-2}。
[UOJ384][HNOI2018]寻宝游戏
位运算中与1和或0两种操作是没有意义的,与0会强制变成0,或1会强制变成1。
如果最终结果某一位是0,那么说明最后一次与0操作后没有或1操作,反之亦然。
把m位每一位单独拿出来看,从后往前可以写成一个长为n的二进制串。把操作符按照与\to1,或\to0的方式也转成一个长为n的二进制串,会发现最终结果的某一位为0,当且仅当操作符对应的二进制串的字典序大于等于这一位上的二进制串的字典序,反之亦然。
所以直接排个序就行了。因为串的倒着输入的,所以可以直接使用基数排序。
[CF1097D]Makoto and a Blackboard
设n=\prod p_i^{\alpha_i},根据乘法分配律,我们只需要求出每个p_i^{\alpha_i}最终期望变成多少就行了。
先忽略p_i只考虑指数,问题转化为了给一个数\alpha_i,每次可以把当前的数x变成[0,x]内的随机一个数,求k次操作后最终剩下[0,\alpha_i]每个数的概率。
直接O(k\alpha_i^2)的dp就行了。k再出大一点可以矩乘,因为\alpha_i不可能很大。如果硬是很大的话可以去参考Codeforces947E(别问我我不会)。
[CF1097F]Alex and a TV Show
对数组f定义莫比乌斯变换g_i=\sum_{i|j}f_j。这样一来集合加依然可以直接按位相加,集合乘也可以直接按位相乘。询问时对集合做逆莫比乌斯变换,因为-1\equiv1\mod 2所以并不用管\mu(i)的符号问题,只需要把非零位拿出来数1的个数就行了。注意这一步需要预处理否则复杂度可能会退化到O(7000m)。
用bitset维护集合,复杂度O(\frac{7000m}{\omega})。
[CF850F]Rainbow Balls
分别考虑每种颜色成为最终剩余颜色的概率。记S为球的总数。
设f_x表示当前有x个制定颜色的球,要求x在到达0之前到达S。可以列出方程:
其中p=\frac{x(S-x)}{S(S-1)}。
由于f_0不存在故f_1=pf_2+(1-2p)f_1+\frac 1S,解得f_2=2f_1-1。
对f_x差分一下可得f_x-f_{x+1}=f_{x-1}-f_x+\frac{S-1}{S-x},故f_1=f_1-f_S=\sum_{i=2}^S(f_{i-1}-f_i)=(S-1)(f_1-f_2)+(S-1)(S-2),因此解得f_1=\frac{(S-1)^2}{S}。
代入递推即可。
[Wannafly挑战赛24D]无限手套
大力dp。设f_{i,j}表示前i种总共选了j个的总和,显然f_{i,j}=\sum_{k=0}^jf_{i-1,k}\times(a_i(j-k)^2+b_i(j-k)+1)。分别维护下j^2,j项系数以及常数项系数就能做到O(nm)了。
[Luogu4482][BJWC2018]Border 的四种求法
设当前询问为[l,r],答案点为w,那么就应该有l\le w<r,lcs(w,r)\ge w-l+1。
我们知道两个前缀的lcs是后缀树上两个节点的lca的深度,因此我们设t=lca(w,r)。上面的限制改为len_t\ge w-l+1。
对后缀树进行树链剖分。分两种情况讨论:t到r的第一条边是轻边,或者t到w的第一条边是轻边。两者可能有交集,但显然并不影响正确性。
若t到r的第一条边是轻边,那么从r出发跳重链就可以跳到t这个点。于是就只需要在t点的RIght集合里找\le\min(r-1,len_t+l-1)的最大的w就行了。线段树合并维护Right集合后线段树上二分即可。这一步的复杂度是O(n\log^2n)的,空间O(n\log n)。
若t到w的第一条边是轻边,仍然从r出发跳重链,假设跳到的点是x,那么此时的t一定位于x所在的重链的前缀上,且w位于重链前缀上某个点的轻子树内。我们可以这样处理:先将询问点对x挂链,接着顺次考虑每条重链,用数据结构维护出这条重链所有轻儿子的w,然后直接查询即可。因为加入w时t是已知的,所以要查询的w需要满足的仍是一个一维的限制。用线段树维护即可。复杂度O(n\log^2n),空间复杂度O(n)。
[LOJ2585][APIO2018]新家
首先把所有询问离线,按时间顺序处理。每家商店在a_i时刻插入,在b_i+1时刻删除,这样时间的影响就没有了。
对于一组询问,首先二分答案,问题转化成了问区间内是否所有颜色都出现过了。使用传统的区间数颜色方法O(q\log^3n)显然无法接受,考虑对每个位置维护其后继相同颜色的位置suf,那么区间[l,r]内出现了所有颜色,当且仅当[0,l-1]内的suf的最大值不超过r。考虑到询问区间之前可能不存在某种颜色的情况,可以在数轴前方放每种颜色各一个,这样就可以直接维护前缀suf最大值了。复杂度O(n\log n+q\log^2n)。
[HDU3629]Convex
考虑四个点不构成凸多边形的情况,一定是一个点位于其他三个点围成的三角形内。我们先枚举一个点,然后考虑计算剩下的n-1个点围成的三角形中有多少个不包含这个点,这个可以极角排序后做到O(n),做法是枚举一个i作为三个点中极角最小的那个,并找到最大的j使i,j的极角相差不超过\pi,这里便可以产生\binom{j-i}{2}的贡献。最终构成凸多边形的四点总共贡献了4的答案,不构成凸多边形的四点贡献了3的答案,所以再减去3\binom n4即可。
[BZOJ1913][Apio2010]signaling 信号覆盖
枚举一个圆,再枚举一个点,求这个点在圆内的概率。发现任意四个点若构成凸多边形则共产生2的答案,否则只产生1的答案。所以向上面那题一样算出四个点构成凸多边形的方案数即可。
[UOJ218][UNR #1]火车管理
用可持久化线段树维护所有栈,记录栈顶和以及压栈的时间戳。弹栈时只需要根据这个时间戳就能够找到压栈前栈顶的权值了。
[LOJ2729][JOISC 2016 Day 1]俄罗斯套娃
对偏序关系连单向边,那么题中所求的东西就是最小链覆盖。根据Dilworth定理,最小链覆盖等于最长反链长度,也就是一个类LIS状物。
询问离线,按高度顺序处理,每次操作为插入一个数或者查询一段后继的LIS长度。只需要用一个支持单点插入,后缀取最大值的数据结构即可。
[LOJ2831][JOISC 2018 Day 1]道路建设
LCT,每次把access途中经过的每一段颜色拿出来,用BIT求答案。复杂度O(n\log^2n)。
[UOJ291][ZJOI2017]树状数组
题目中树状数组的写法实际上是维护了后缀和。也就是说九条算出来的答案是[l-1,r-1]的区间和。
于是我们就只需要求l-1位置与r位置被修改次数的奇偶性相同的概率就行了,注意l=1需特判。
不能直接计算l-1为奇数的概率\times r为偶数的概率+l-1为偶数的概率\times r为奇数的概率,因为一个同时包含了l-1与r的区间是只能修改一个值的。所以应该用一个二维数据结构维护区间,即左端点一维右端点一维,询问时二维数点即可。
[UOJ349][WC2018]即时战略
首先链的情况需要特判掉。将编号随机打乱后依次加入可以做到期望O(n+\log n)次询问。
LCT。每次新加入一个点时,从1号点出发开始询问,如果得到的点在当前重链上就在splay上二分找点,否则就需要切换重链。找到位置后link一下维护树的形态并执行access操作。
这个做法看上去很假但是我也不知道怎么它就过了。
[CF671D]Roads in Yusland
给一棵n点的树和m条直链(连接一个点与它的某个祖先),每条链有个权值c_i,求选出一些链覆盖树上所有边且权值和最小。
这个问题可以转对偶做:给每条树边确定一个权值,要求每条链覆盖的所有树边的权值和不超过c_i,最大化所有树边的权值和。可以自底向上贪心,每次选能选的最大权值,需要合并所有儿子的限制,可并堆即可。
[BZOJ5317][JSOI2018]部落战争
对两个点集分别求出凸包,设为A,B,题意是给出一个向量t,问是否存在a\in A,b\in B满足b+t=a,移项可得a-b=t,故构造A-B的闵可夫斯基和,然后判断点是否在凸包内即可。
[CodeChef - SADPAIRS]Chef and Sad Pairs
首先建圆方树,然后对每种颜色的点建立虚树。在虚树上出现了的点的答案可以直接统计,其余的贡献对于每条边是相同的,所以直接树上差分统计即可。
[CF671C]Ultimate Weirdness of an Array
考虑计算当f(l,r)\le i时,每个l对应的右端点r最左能取到哪里,记为next_l。初始时next_l=l。
从大到小枚举i,考虑当限制从f(l,r)\le i变成f(l,r)<i后,哪些next_l会发生改变。取出所有是i的倍数的数的位置下标,记为x_1,x_2...x_m,因为f(l,r)中至少要包含m-1个x_i(不然f(l,r)就至少是i了),所以l\in[x_2+1,n]内的next_l直接变成n+1,l\in[x_1+1,x_2]的next_l对x_m取\max,l\in[1,x_1]的next_l对x_{m-1}取\max。每次修改后统计\sum_{l=1}^nn+1-next_l就是满足f(l,r)\le i的区间数。
看上去需要O(n\log^2n)的吉利线段树,但实际上next_l是随下标单调的,所以取\max操作修改的一定是区间的一段前缀,直接暴力就好了。复杂度O(n\log n)。
[LOJ2978][THUSCH2017]杜老师
乘积为完全平方数就是要求每个质因子的出现次数为偶数。
对每个质因子的出现次数列个异或方程,相当于要求这个异或方程的解的个数。
把方程写成矩阵的形式,设这个矩阵的秩为r,显然答案就是2^{R-L+1-r}。
所以我们需要求秩。
有一个结论是R-L+1\ge 6000时矩阵的秩就等于区间内包含的质数个数,也就是说每个质数的方程都是线性无关的。那么就只需要考虑R-L+1< 6000的情况了。
直接暴力高斯消元的话,质数个数可能会很多。但是由于每个数至多含有一个大于\sqrt R的质因子,所以我们对每个大于\sqrt R的质因子记录一下是否出现了,对所有小于等于\sqrt R的质因子进行高斯消元就行了。
[LOJ2977][THUSCH2017]巧克力
如果c_{i,j}很小,可以直接状压记录状态转移。转移就是裸的斯坦纳树。
现要求在最小化块数的前提下最小化中位数,可以二分中位数mid,将a_{i,j}大于mid的位置设为M+1,否则设为M-1,其中M是一个较大的数。这样就可以在不影响块数的前提下二分得到最小的中位数。
还需要解决的一个问题是c_{i,j}可能很大。可以将每个c_{i,j}随机映射到[1,k]内,当构成答案的k种数分别映射到[1,k]的不同值时就一定可以求出正确答案。
[CodeChef - TREEWALK]Walk on Tree
有一个显然的O(n^3\log k)矩乘做法。
下一步没什么意思,直接BM就做到O(n^2\log k)了。
[LOJ2980][THUSCH2017]大魔法师
用矩阵表示线段树标记,用一个1\times4的行向量表示a,b,c值的和以及区间长度。六种操作对应的矩阵分别为:
需要卡常。两个矩阵标记合并的时候如果一者为单位矩阵就直接赋值,此外多加一些“如果值为0就不转移”的判断就行了。
[LOJ2979][THUSCH2017]换桌
显然费用流。对所有人建nm个点,先给每一桌连成一个环,然后考虑跨桌的移动。建两棵线段树,一棵表示“向左走”一棵表示“向右走”,即分别向左/右子树走时产生代价。建出图后大概会有10k+的点数和90k+的边数,然而spfa费用流+多路增广就过了。
[LOJ2981][THUSCH2017]如果奇迹有颜色
首先根据polya定理有ans=\frac{\sum_{i=1}^nf(gcd(i,n))}{n}=\frac{\sum_{d|n}\varphi(\frac nd)f(d)}{n},其中f(n)表示长度为n的环保证任意相邻m个数不出现m种不同颜色的方案数。现在考虑求f(n)。
暴力dp复杂度O(m^{2m-1}n),因为总状态数为m^{m-1},需要枚举起点后暴力枚举所有状态,每个状态需要O(m)转移。可以矩乘优化到O(m^{3(m-1)}\log n)但是没有什么卵用。
直接暴力求出前若干项后BM即可。m=6开-Ofast
跑了大概17\min,m=7还没跑出来。
update:算了一下要跑差不多两天。弃疗了,去loj上蒯了yww的递推式打出了n\le1000的表。
update2:最后一个点跑得有点慢,估计出题人的原意是想要选手打表?
[LOJ2732][JOISC 2016 Day 2]雇佣计划
连续段数等于边界数除以2,这里的边界需要满足相邻两数一个\ge v一个<v(假设a_0=a_{n+1}=0)。
对于相邻的两个数a,b,他们会使得位于(a,b]的所有询问的答案加1。
所以树状数组xjb维护一下就行了。
[LOJ2838][JOISC 2018 Day 3]比太郎的聚会
需要求的信息非常不好维护。考虑根号分治。
发现\sum Y_i\le 10^5,所以可以对询问的Y_i分治,令B=\sqrt{10^5},若Y_i<B,则对每个点维护到达它距离前B大的点集。否则这样的询问个数不超过B,直接暴力dp一遍即可。
[LOJ2881][JOISC 2014 Day3]电压
先建出dfs树,这时候所有非树边都一定是返祖边。我们记0边表示连接两点在树上深度相差为偶数的非树边,1边表示连接两点在树上深度相差为奇数的非树边。
若需要使某条树边成为答案,必然是使这条树边连接的两端点染同色,然后剩下的点黑白染色(树是二分图啊)。这就需要这条边满足两个性质:不存在1边覆盖这条树边,且所有0边都覆盖这条边。树上差分一波即可解决。
若需要使某条非树边成为答案,发现当且仅当只有一条0边的时候,这条0边才有可能成为答案。这个特判一下就好了。
[UOJ193][UR #14]人类补完计划
发现要求的东西就是从原图中选出一棵基环树,贡献是2的基环树上非叶节点个数次方。我们假设现在已经求出了h_s表示s这个点集构成一棵基环树的方案数,由于不知道叶子节点的个数,我们考虑删除所有叶子节点,这样剩下的部分肯定还是一棵基环树。但是这样的方案可能会算重,所以需要容斥一下,那么s集合对答案的贡献就是ans_s=\sum_{t\subseteq s}(-1)^{|t|}h(s-t)2^{|s|-|t|}。
那么如何求h_s呢?首先我们可以求出点集s连成一个环的方案数,这个记个f_{i,j}表示从__builtin_ctz(i)
出发到j,经过了点集i的方案数,枚举新加入那个点转移,要求新加入的点编号大于__builtin_ctz(i)
,当首尾可以相连时便计入答案。接着可以考虑在环上加入某个点集,每个点都是独立的所以转移系数是每个点向环上点连边方案数的乘积。由于同样会算重所以也需要容斥。
[UOJ192][UR #14]最强跳蚤
给每个质因子随机一个权值,求异或和为0的树上路径条数即可。
[UOJ186][UR #13]Yist
考虑每个需要被删除的数x。找到它左边第一个不需要被删除且比它小的数u,右边第一个不需要被删除且比它小的数v(假设左右两侧分别有一个不需要被删除的0),那么删除x可行的最长区间长度是v-u-1-(u,v)中比x小的且要被删除的数,答案就是对每个要被删除的数的答案取\min。考虑优化这一过程,从大往小枚举x,那么当某个x的区间与前一个x'的区间有交,则x的区间会完全包含x'的区间,从而使x的答案一定大于等于x'的答案,这样就可以直接continue
了。由于每个位置至多被访问到一次,所以复杂度线性。
[UOJ311][UNR #2]积劳成疾
}设f_{i,j}表示长度为i的区间最大值不超过j的所有方案的权值之和。转移时先从f_{i,j-1}转移过来,接着就枚举最大值第一次出现的位置,设为p,那么此时就确定了\min(i,p+k-1)-\max(k,p)+1个长度为k的区间的最大值,因此f_{i,j}=f_{i,j-1}+\sum_{p=1}^iw_j^{\min(i,p+k-1)-\max(k,p)+1}f_{p-1,j-1}f_{i-p,j}。注意当i<k时f_{i,j}=j^i。
[UOJ308][UNR #2]UOJ拯救计划
可以发现答案是\sum_{i=1}^kA_k^i\times选i种颜色给原图染色使得相邻点不同色的方案数。由于当i\ge 3时6|A_k^i,所以就只需要考虑i=1,2的情况了。注意当不存在边的时候i=2的方案数应为2^n-2。
[UOJ74][UR #6]破解密码
显然s_i=\frac{26h_i-h_{i+1}}{26^n-1}。当26^n\equiv1\mod p时不能做除法,此时可以直接用h_0构造一个字符串,只要这个字符串对h_0合法它就一定对所有h_i都合法。
[UOJ75][UR #6]智商锁
生成树的方案可以划分为若干子集的生成树方案的乘积,只需要把这些子集连成一棵树即可。
随机1000张25个点的图,对每张图用基尔霍夫矩阵求出其生成树个数,设为f_i,我们只需要找到四个数a,b,c,d使f_a\times f_b\times f_c\times f_d=k即可。双搜+哈希表即可。
至于这样为什么是对的......你可以认为所有的f_i都是在[0,mod)之间随机分布的,这样就大概率能得到解?
[UOJ118][UR #8]赴京赶考
仔细yy一下后会发现两维是独立的,然后就做完了。
[UOJ119][UR #8]决战圆锥曲线
答案点不一定在凸壳上,但是满足存在j使得i<j,a_i\le a_j的i一定是没用的。那么有用的i必然是一个下降序列,由于数据随机因此个数期望\log n。查询时在定位到\log n个线段树区间后,先访问右子树更新答案,再访问左子树更新,单次查询期望复杂度O(\log^2n)。
[UOJ91][集训队互测2015]最大异或和
先对原序列差分,这样不改变其能够线性组合出的向量集合。这样以来操作一就是两个单点修改,操作二是两个单点修改加上一段区间覆盖为0。由于一次修改操作至多让两个位置变成非0,所以暴力覆盖成0的复杂度显然会是对的。
接下来就是动态线性基的问题了。这篇题解里面的第三道题有讲。
[UOJ168][UR #11]元旦老人与丛林
先瞎猜一个结论:答案为Yes
当且仅当对于任意点集V,其导出子图的边集E满足|E|\le2|V|-2。
所以就只需要检验是否存在一个点集V与其导出子图的边集E满足|E|>2|V|-2就行了。转化成最大权闭合子图的模型,点的权值为-2,边的权值为1,求最大权非空闭合子图的权值是否大于-2即可。
但是当最大权非空闭合子图的权值小于0时我们求出的答案一定会是0,所以需要强制选后一个点使其权值为0,然后判断最大权闭合子图的权值是否大于0即可。
看上去需要跑n次网络流,但实际上每次就只有一条流量为2的边发生了改变,所以直接退流即可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
2018-01-15 [ZOJ3435]Ideal Puzzle Bobble
2018-01-15 [BZOJ2820][Luogu2257]YY的GCD
2018-01-15 [HDU4746]Mophues