Last dance
Last dance
ARC183D Keep Perfectly Matched
我们考虑一条边的贡献到底是多少,那么假设它连的两个结点的子树大小分别为 x,yx,y。上界显然为 min(x,y)min(x,y)。
大胆猜结论,一定能取到上界。
首先,我们定根,显然重心比较优秀,然后考虑重心分为了 T1,T2,⋯,TkT1,T2,⋯,Tk,kk 个子树,其中每个子树的根我们记为 root(Ti)root(Ti)。
假设根一开始与 root(Ti)root(Ti) 配对,那么每次我们就可以找到一个 TjTj,满足 i≠ji≠j,然后选择 Ti,TjTi,Tj 的两个叶子删去,这个时候根就和 root(Tj)root(Tj) 配对了。贪心的来讲,每次我们肯定是选择那个 |Tj||Tj| 最大的 jj。
我们现在考虑如何每次找到当前要删的合法点。
我们考虑一个点如果和父亲配对,那么这个点的儿子可以任意顺序删;如果一个点与其中一个儿子配对,那么这个点必定是选择先删这个儿子的点。
这样子,我们求出这个树的后序遍历,满足先走匹配边。然后套用上述过程即可。
ARC183E Ascendant Descendant
我们求出每一个位置 ii 可以移动到的区间 li,rili,ri,表示 aiai 可以为 bj(j∈[li,ri])bj(j∈[li,ri]) 的祖先。
思考一下,如果两个区间交了会怎么样,我们惊奇的发现,这并不合法,画个图看一下就知道了。
所以,区间都是形如包含或者不相交的两种情况。
那么我们可以建成一棵树。
但是我们发现 ii 最终不一定能走到 li,rili,ri,因为会存在一些限制。
我们考虑一个区间 L,RL,R,如果这个区间的所有 li,rili,ri 的并恰好是 [L,R][L,R],那么这个区间把外界隔开了,也就是,其它区间穿越不了 [L,R][L,R]。
我们容易说明这个限制是唯一的。
现在考虑如何求出最终 ii 的区间 [l′i,r′i][l′i,r′i],我们从小到大枚举每个区间 [li,ri][li,ri]。
我们使用 set
维护每一个区间限制还有多少个位置,如果遇到一个 (i,li,ri)(i,li,ri),我们就从 ii 向左向右找到第一个 =0=0 或者碰到边界的位置,中间的这些区间都是可以到达的,然后再把中间这些区间合并,这样子感受一下很对。
注意到最终算的是有多少种不同的 aa 序列,所以如果两个位置的答案区间相同,那么就会重复算,除一下阶乘即可。
CF1270G Subset with Zero Sum
接下来是一道非常 nb 的题目,这道题目 tourist 和 Benq 都没有场切。
首先我们先移项,即 1≤ai−i≤n1≤ai−i≤n。
我们思考等于 00 的本质是什么呢。
仔细想一下,感觉可以建图,于是,我们连边 (i,ai−i)(i,ai−i),然后发现就做完了。
对于这个基环树森林的一个环,选这些位置一定合法,这个易证。
关键是怎么想得到的呢?首先建图是应该可以思考的,然后我们考虑把 00 和环尽量联系在一起,这样子应该好想一点。
gmoj 8251 冒泡排序
下文定义逆序对数表示前面的比它大的数的数量。
性质一:假设现在在处理第 xx 个数,就是说此时 i+K−1=xi+K−1=x。那么,[x−K+1,x−1][x−K+1,x−1] 这段区间的数一定是前 x−1x−1 个 aa 中的前 K−1K−1 大。
证明:
如果这个数是前 x−1x−1 个的前 K−1K−1 大,那么它一定会存在于 [j−K+1,j][j−K+1,j] 的第 22 位之后(j<xj<x)。
性质二:不考虑操作 11 号位置。假设某个数的逆序对数为 xx,那么它实现一次操作会将 x−(K−1)x−(K−1)。
证明:
根据性质一,我们把比这个数大的,也就是前 K−1K−1 大的,都移到了这个数的前面,所以一次操作的变化为就是 K−1K−1。
根据性质二,我们容易知道,一个数的位置会在操作一次之后减去 K−1K−1。
我们观察到如果一个数到了 KK 之前,那么它可以在新的一轮里面操作 11 号位置导致这个数合法。
那么我们就会把那些相同轮数到达 ≤K≤K 位置的数放在一起做,这样就做完了。
gmoj 8253 一眼
超级无敌构造题。
假设 m=2n−2m=2n−2。
我们考虑类似哈希表的事情。
如果 i,i+ni,i+n 只出现一个,那么我们直接让 ai=iai=i 或者 ai=i+nai=i+n,具体构造如下。
- 对于 i≤n−3i≤n−3,若 i,i+ni,i+n 出现其中一个,就用上面的方法。
- 否则,若两个都出现,我们发生了哈希冲突,那么我们就把 i+ni+n 的放在那些 i,i+ni,i+n 都没出现的位置。
- 剩下的 ii 我们只需要保证不冲突即可,直接循环移位。
我们现在只需要证明剩下的 ii 的数量 ≥2≥2。
证明:
- 如果 i≤n−3i≤n−3 的 i,i+ni,i+n 冲突数量 ≥2≥2,则合法。
- 否则,由于 m=2n−2m=2n−2,多留了 22 个位置,所以 n−1,n−2n−1,n−2 至少存在一个,因此也符合条件。
于是结束了,听说是 姚期智的论文。
gmoj 8252 珍珠
拆位,现在需要求出第 ii 位为 0/10/1 的方案数,设其分别为 f0,f1f0,f1。
首先,考虑没有 X,YX,Y 怎么做。
f0+f1f0+f1 是显然的,由于我们要求 f1f1,我们考虑求出 f1−f0f1−f0。
于是想办法构建双射。
考虑一个偶数位置 pp,我们设其最小的位置满足该位为 11 是 jj。
那么我们将 Ap−1⊕2i−jAp−1⊕2i−j,那么显然,新的这个序列的答案为原本的答案取反。因此这个是一个双射!
由此,我们就说明了,偶数位置一定是 00 才有贡献,剩下的随便填即可。
现在考虑有 X,YX,Y。
如果 Y=0Y=0,我们直接分成两个序列做。
如果 Y≠0Y≠0,那么假设 XX 或者 n−X+1n−X+1 是偶数,就寄了,此部分的 f1−f0=0f1−f0=0。
否则,保证 n,Xn,X 都是奇数。我们把偶数位置取出来,可以类似上面证明,偶数位置都必须取 00。
坑:注意要把更高位的贡献算上!
Baggage
逆天构造。
记 f(x)f(x) 表示 n=xn=x 的时候的最小步数。
观察样例,容易发现 f(x)=xf(x)=x。
yhx 先证明了一个结论:f(x)≥xf(x)≥x。
具体来说,初始相邻相同的数为 00,最终为 2(n−1)2(n−1),每次至多使得这个东西增加 22,所以 f(n)≥nf(n)≥n。
然后我们给出构造。
当 n=3n=3 的时候,构造如下图。
接着我们考虑 n≥4n≥4 的情况。我们把原问题分成两个步骤。
- 提取 AB,BAAB,BA 这样的子段,然后重排。
- 提取 AA,BBAA,BB 这样的子段,然后重排。
观察上图,这种构造的充要条件就是绿色的数量和黄色的数量相同。
我们尝试给 n=4,5,6,7,8,9n=4,5,6,7,8,9 找到构造方案。


注意到,我们 mod4mod4 分类,很有性质。
每次相当于在两边加了一个 pattern。于是实现这个东西即可。
ARC163 D Sum of SCC
差一点想到了。
显然竞赛图缩点之后是链,那么链长的组合意义,就是把链分成两个部分的方案数 −1−1。
满足两个部分一部分全部边连向二部分。
所以我们直接计数这样的划分有多少个,显然可以设 fi,j,kfi,j,k 表示前 ii 个数有 jj 个在左边,u<vu<v 有 kk 个。
最后处理一下 −1−1 即可,怎么就想不到呢!
2024年全国中学生数学奥林匹克竞赛 预赛 二试 T4
设 A,BA,B 为正整数,SS 是一些正整数构成的集合,具有以下性质:
性质 1:对于任意非负整数 kk,有 Ak∈SAk∈S。
性质 2:对于任意一个 n∈Sn∈S,若 d|nd|n,则 d∈Sd∈S。
性质 3:对于任意两个数 m,n∈Sm,n∈S,若 gcd(n,m)=1gcd(n,m)=1,则 nm∈Snm∈S。
性质 4:对于任意一个 n∈Sn∈S,有 An+B∈SAn+B∈S。
试证:所有正整数 gcd(x,B)=1gcd(x,B)=1,满足 x∈Sx∈S。
引理 1:若质数 p|Ap|A,则 ∀k∈N,pk∈S∀k∈N,pk∈S。
引理 2:对于某个数 nn,若 n=∏ki=1pcii∈Sn=∏ki=1pcii∈S,且 m=∏ki=1pdiim=∏ki=1pdii,则 m∈Sm∈S。
这个根据 性质 3 就可以推得。
引理 3:对于所有正整数 kk,若 n∈Sn∈S,有 Akn+B∈SAkn+B∈S。
设 n=∏ki=1pdii×∏k′i=1qeii,A=∏ki=1pciin=∏ki=1pdii×∏k′i=1qeii,A=∏ki=1pcii。
那么记 n1=∏k′i=1qeii,n2=nn1n1=∏k′i=1qeii,n2=nn1。
显然 gcd(n1,n)=1gcd(n1,n)=1。
根据 引理 1 和 引理 2,我们可以证明 Ak−1n2∈SAk−1n2∈S。
显然 gcd(Ak−1n2,n1)=1gcd(Ak−1n2,n1)=1,根据 性质 2,n1∈Sn1∈S。
那么根据 性质 3,Ak−1n∈SAk−1n∈S,所以根据 性质 4,Akn+B∈SAkn+B∈S。
引理 4:若 n∈Sn∈S,则 n+B∈Sn+B∈S。
设 n+B=∏ki=1pfii×∏k″i=1ogiin+B=∏ki=1pfii×∏k′′i=1ogii,A=∏ki=1pciiA=∏ki=1pcii。
那么记 n3=∏k″i=1ogii,n4=∏ki=1pfiin3=∏k′′i=1ogii,n4=∏ki=1pfii。
显然 gcd(n3,n4)=1,gcd(n3,A)=1gcd(n3,n4)=1,gcd(n3,A)=1。
根据 引理 2,我们可以证明 n4∈Sn4∈S。
由于 gcd(n3,A)=1gcd(n3,A)=1,则根据欧拉定理,Aφ(n3)≡1(modn3)Aφ(n3)≡1(modn3)。
则 Aφ(n3)n+B=(Aφ(n3)−1)n+B+n≡0(modn3)Aφ(n3)n+B=(Aφ(n3)−1)n+B+n≡0(modn3)。
根据 引理 3,Aφ(n3)n+B∈SAφ(n3)n+B∈S,所以 n3∈Sn3∈S。
根据 性质 3,n+B=n3×n4∈Sn+B=n3×n4∈S。
回到原问题。
根据 性质 1,容易得知 1∈S1∈S。
则反复利用 引理 4,能证明 1+xB∈S1+xB∈S,其中 x∈Nx∈N。
设 gcd(n,B)=1gcd(n,B)=1。
根据裴蜀定理,容易知道存在 y∈Zy∈Z,满足 yn−xB=1yn−xB=1,因此,yn∈Syn∈S,那么 n∈Sn∈S。
本题的主要思路,就是先考虑 gcd(n,B)=1gcd(n,B)=1 可以构造什么,可以想到裴蜀定理。
然后目的就是要证明 引理 4,这个感受发现很对。但是证明 引理 4,感觉就有点非人类了,可能是我太菜了。
于是就做完了这道题。
[NOI2023] 桂花树
打表可以发现,答案与树的形态无关。
条件一可以等价为:TT 和 T′T′ 的 [1,n][1,n] 中的点构成的虚树相同。
条件二可以等价为:对于任意 ii,T′T′ 中 [1,i][1,i] 构成的虚树,不包含 >i+k>i+k 的结点。
我们考虑增量加入点。
首先两种情况,就是直接在一个结点下方加入一个叶子,另一种就是在一条边中插入一个结点。
但是我们还会出现,这样的情况
这样的话,我们称这个 [i+1,i+k][i+1,i+k] 的点为空白点。
那么空白点是待确定的,我们可以之后再确定这样的点。
于是还有第四种情况,就是确定一个空白结点。
注意到,我们需要保证的,就是以后确定的这个空白点,在前 kk 轮必须放了,否则就作废了。
所以可以记录二进制状态 SS,表示目前未被确定的空白点的集合。
那么直接转移即可,时间复杂度 O(Tm2kk)O(Tm2kk)。
ARC180E LIS and Inversion
结论都弄出来了,差一点。
注意到如下两个结论:
- 我们最后一定是一个把值域 [l,r][l,r] 翻转,其它从大到小填的序列。
- >r>r 的部分一定是原序列前缀。
这两个结论我通过打表看出来了,感觉也是挺对的。
根据以上两个结论,我们容易说明,只有 LIS 是有贡献的。
因此,枚举 ii 表示 >r>r 的数的个数,那么显然,bj=ibj=i,jj 为 LIS 的部分。
所以我们尽可能使得后面的 aj≤iaj≤i,都给 LIS 部分,LIS 的剩下部分,就全部贡献为 11。
这样子直接贡献到答案就行了,我们发现是一个分段函数,可以数据结构维护,做到 O(nlogn)O(nlogn),应该可以精细实现做到 O(n)O(n)。
还有一种 dp 做法,待补。
ARC175E Three View Drawing
我们注意到,一个三元组 (x,y,z)(x,y,z),其出现了 (x,y),(y,z),(z,x)(x,y),(y,z),(z,x) 三种,所以应当与 (z,x,y),(y,z,x)(z,x,y),(y,z,x) 放在一起。
那么这三个三元组的共有性质就是 x+y+z≡0(mod3)x+y+z≡0(mod3),而且是充要条件,所以就可以直接构造了。
具体的,我们发现若 nmod3=0nmod3=0,只有 (0,0,0),(n3,n3,n3),(2n3,2n3,2n3)(0,0,0),(n3,n3,n3),(2n3,2n3,2n3) 三种情况比较特殊,剩下的都是上面的三元组。
否则,只有 (0,0,0)(0,0,0) 比较特殊。
那么我们考虑把 mm,先拆分成若干个三元三元组,然后拼上一些没有出现过的 (x,x,x)(x,x,x)。
这是容易的,直接暴力枚举,打标记即可,我们可以证明一定存在至少 mmod3mmod3 个 (x,x,x)(x,x,x) 时空闲的。
ARC169E Avoid Boring Matches
这道题很神。
首先合法解的判断是显然的。
现在我们判断一个串能否是合法的(不移位)。
我们注意到,一次匹配一定是将某个 B
与最近的 R
匹配,这个结论容易说明。
首先,我们知道若 B
占据了前 2n−12n−1 个位置,这个序列一定合法。
于是可以猜测,我们定义一个比较函数 ff,一定存在一个分界线,使得,所有小于等于这个串的答案为 00,而最终目标就是把原串变成这个分界线的串。
我们称其为最劣合法解。
首先有一个显然的观察,若一个串合法,若存在位置 i,ji,j,满足 SiSi 为 R
,SjSj 为 B
,那么交换 i,ji,j 这两个位置得到 S′S′,S′S′ 也合法。
于是,对于同一个相对位置的 SiSi 和 TjTj 都为 B
,我们看 i,ji,j 的大小关系定义此时的 ff,同一个相对位置指的是前面 B
的出现次数。注意:ff 是基于同一个相对位置而言的,而不是整个串。
所以,我们只需要对于 nn 构造出来一个 2n2n 的最劣合法解即可。
我们注意到,它是最劣的,当且仅当 B
的位置要尽可能右。
设 TiTi 表示长度为 2i2i 的最劣合法解,显然 T1T1 为 RB
。
那么对于 TiTi 如果 Ti−1Ti−1 当前为 B
,就在 TiTi 后面加上 BR
,否则加上 R
。剩余部分都使用 B
填充即可。
那么直接计算答案,就是对于同一个相对位置 B
计算 max(i−j,0)max(i−j,0) 的和,因为如果 i<ji<j 则这个位置比最劣解更优,不需要换。
考虑为什么存在 i>ji>j 则一定是不合法的。
原因是:考虑归纳证明,然后我们取出第一个满足 i>ji>j 的位置,那么经过一轮贪心匹配操作就会不合法,具有归纳性。
gmoj 8245 送分题
假设固定 (i,k)(i,k),那么合法的 jj 一定是一段区间。
设 ff 表示这段区间每种数出现最晚位置的最小值,gg 表示每种数出现最早位置的最大值。
那么贡献为 max(f−g,0)max(f−g,0)。
设 fi,gifi,gi 表示固定 kk,ii 这个点动,[i,k][i,k] 的上面信息。
当插入 i+1i+1 号结点时,设 ai+1ai+1 这个数上一次出现在 lstlst 位置,那么 [lst+1,i+1][lst+1,i+1] 这个区间的 gg 都变成 i+1i+1。
ff 的话,我们发现 fj=lstfj=lst 的这些 jj 都要变大,于是维护一个单调栈,每次把 fj=lstfj=lst 的变成比 lstlst 大的那个值。
用线段树维护 ff 的和 gg 的和,两个数组都是单调的,所以可以直接线段树二分维护贡献和。
gmoj 8164 划分队伍
先把二元环判掉。
我们拆贡献,考虑 ii 什么时候与 aiai 匹配,每个点都算一遍,总和就是要求的东西。
我们观察一下,若 ii 和 j=aij=ai 匹配了,有什么条件。
一个比较基础的观察就是,设 cici 表示 ii 这个点的出现时间,那么 cj<cicj<ci,且 ak=j,k≠iak=j,k≠i 的点 kk (称之为 jj 的儿子点)要满足 ck∉[cj,ci]ck∉[cj,ci]。
但是,这是必要条件,但不充分。
所以,我们需要减掉 jj 这个点和 ajaj 匹配的方案,这个也是同理,我们算不出来,所以继续让 j→ajj→aj,这样的话,最终形成一个 ρρ。就可以类似容斥的计算了。
现在的问题是,最终的排列要保证若干个点不在某个区间内,我们继续容斥。
设 fi,jfi,j 表示考虑前 ii 个位置,目前钦定了 jj 个点在所对应的区间,剩下的乱填的方案。
那么枚举 kk 表示 i+1i+1 这个位置的点的儿子中选了多少个钦定,然后贡献就是 (sz−1)k_(sz−1)k––,szsz 表示儿子个数,可以转移到 fi+1,j+kfi+1,j+k。
最后我们剩下的那些直接乱填即可,容斥系数显然为 (−1)j(−1)j。
注意一下,最后一个点需要特判,要把前面的某个 szsz 再减去一去 dp。
容易发现这个 dp 是 O(n2)O(n2),第二维的总和是 O(n)O(n)。
所以总时间复杂度为 O(n3)O(n3)。
gmoj 8247 经典题
第一步转化很妙!
首先特判 k1=k2k1=k2,然后钦定 k1<k2k1<k2。
我们考虑对于每一个 pp 单独考虑,这个显然是正确的。
对于某个 pp,设 a=pi,b=pja=pi,b=pj。
那么贡献就是 pik1+jk2pik1+jk2。
我们固定,ik1+jk2=hik1+jk2=h,我们肯定要 i+ji+j 尽量小。
设 δ1=k1gcd(k1,k2),δ2=k2gcd(k1,k2)δ1=k1gcd(k1,k2),δ2=k2gcd(k1,k2),那么 i−δ2,j+δ1i−δ2,j+δ1 肯定答案不变,i+ji+j 变小。我们要使得 i,ji,j 是非负整数,显然,i−δ2<0i−δ2<0,因此 i<δ2i<δ2。设 k=δ2k=δ2。
意思是,pipi 不能含有 pkpk 这个因数,积性起来,意思就是,aa 这个数不能含有任何大于 11 的数的 kk 次方作为因数。
我们枚举一个数 ii,钦定 aa 含有 ikik 这个数的因数。容斥系数显然为 μ(i)μ(i)。
那么目标就转化成了 ∑xy≤Nxk1yk2∑xy≤Nxk1yk2。
注意到 x,yx,y 必定有一个 ≤√N≤√N,所以枚举那个容斥一下,剩下的就是自然数幂和,观察到一定是 ⌊nx⌋⌊nx⌋ 的形式的自然数幂和,预处理即可,这部分可以做到 O(√N)O(√N)。
所以现在复杂度大概就是 ∑k√ni=1√nik∑k√ni=1√nik,k>1k>1,可以证明复杂度为 O(√nln√n)O(√nln√n)。
星之器
这道题目没有想出来,我太唐了。
其实知道结论就做出来了,结论是,答案与实际操作无关,就是乱操作即可。
证明:
一维的情况,显然匹配可以互换,因为一定是 i−j≥0i−j≥0,所以是对的。
二维也类似。
这样的话,先把始态减去终态。然后我们直接操作到最后两列,操作到最后四个格子,因为一定有解,所以都是 00。
正解就是,考虑结论实际是什么,可以用势能理解。
我们定义一个位置上一颗星的势能为 f(x,y)f(x,y),显然 x,yx,y 轴独立。
设 g(x)g(x) 表示位于 xx 位置的一颗星的势能。
那么 g(x1)+g(x2)−g(x1+1)−g(x2−1)=x2−x1−1g(x1)+g(x2)−g(x1+1)−g(x2−1)=x2−x1−1。
所以 g(x)−g(x−1)−xg(x)−g(x−1)−x 为定值,容易构造:g(x)=g(0)=0g(x)=g(0)=0,那么 g(x)=x2+x2g(x)=x2+x2。所以每颗星的势能可以求了,总的就可以求了。
这种思想值得借鉴!
AGC050A AtCoder Jumper
考虑 modnmodn 的一个剩余系,我们容易说明 i×2,i×2+1i×2,i×2+1 在这个系中每个可以保证每个数出现两次。
这样子就一定符合条件了,因为每次经过 O(dep)O(dep) 轮一定可以遇到所有数。
ARC155D Avoid Coprime Game
假设我们每次要求 gg 变小,那么可以直接设 fifi 表示目前 g=ig=i,先手是否获胜。
显然,我们枚举 j|i,j≠ij|i,j≠i,那么 fi=P(fj),∃k,gcd(ak,i)=jfi=P(fj),∃k,gcd(ak,i)=j,其中 P(x)P(x) 表示所有 xx 的取反的或的值。
继续观察一下,现在 gg 可以不变,相当于什么,相当于我们可以拖延时间。
如果存在一个后继状态先手是必败的,直接走过去即可,否则,先后手就会一直选择 gg 的倍数,以确保不输,我们发现,只跟 gg 的倍数数量有关,那么就可以设 fi,jfi,j 表示目前 jj 轮先手是否败,容易发现,只有 jj 的奇偶性是重要的,且 gg 的倍数数量恰好就是到最后经过的步数,所以 fi,bimod2=1fi,bimod2=1。
答案显然就是 fai,0fai,0。
现在需要判断 ∃k,gcd(ak,i)=j∃k,gcd(ak,i)=j,考虑容斥,因为我们很容易计算 ∑k[j|gcd(ak,i)]∑k[j|gcd(ak,i)],所以直接减掉倍数,从大到小做即可。
时间复杂度可以做到 O(∑d(n)2)O(∑d(n)2)。
ARC158D Equation
注意到左边和右边都是齐次的,且次数刚好差 11,所以我们想办法把右边的式子乘上一个数。
考虑对于一组 (x,y,z)(x,y,z),我们设左边的式子为 aa,右边的式子为 bb,若 a≠0,b≠0,a≡kb(modm)a≠0,b≠0,a≡kb(modm), 那么我们直接让 (xk,yk,zk)(xk,yk,zk) 是合法的。
根据打表可以发现,合法的数量很多,所以我们直接随机 (x,y,z)(x,y,z),使得 a,ba,b 都不为 00 即可。
可以证明期望次数 O(1)O(1)。
CF2002E Cosmic Rays
一个显然的观察是,如果每一个 bb 不同,那么答案就是 max(ai)max(ai)。
两个 bb 相同的段可以合并,当且仅当中间的数都比他们短,于是可以维护一个数量递减的单调栈,每次把比当前小的合并,合并就类似,如果当前是同色的,那么就把刚刚弹出的异色栈顶取出来,两边加起来减掉这个数即可。
ARC184D Erase Balls 2D
这道题需要感受。还是需要仔细想想该怎么做再写。
先放在二维平面上。
我们考虑,对于一个 i,ji,j,若满足 i,ji,j 有那个偏序关系,那么删了 ii 就不能删除 jj,反之同理。
考虑 dp,设 fifi 表示最后一个选择删的点为 ii 的方案。
那么枚举一个 jj,保证 aj>aiaj>ai,我们直接转移显然会算重,观察什么情况不会算重。大概就是,如果存在一个 i,ji,j 中间夹了一个 kk,那么如果 kk 选不选择对当前的状态没有新的作用的时候,我们就会算重,此时就需要钦定一个代表元。
我们把不存在上述 kk 的进行 dp,容易思考它是正确的,于是直接维护二维前缀和即可。
ARC184B 123 Set
这个题真的很厉害!
我们令构造一个矩阵,其中第一个数为 11,向右,每个数等于左边那个数 ×3×3,向下,每个数等于上面那个数 ×2×2。那么我们需要保证,一个数的左边和上面至少一个被选,由于 logn3logn3 很小,可以考虑直接状压 dp。
观察到 5,7,⋯5,7,⋯ 这些数没有被计算,类似的,我们把这些数也算一下。
容易观察到,对于一个起点 xx,若 ⌊nx⌋⌊nx⌋ 相同,那么这个矩阵是等价的,可以一起算,于是直接数论分块。
状压 dp 可以轮廓线 dp 或者直接记录一下子集和什么的,反正复杂度能过。
ARC184C Mountain and Valley Folds
可以分治构造 M
,由这个构造,容易思考充要条件就是,该位置 xx 的最低二进制 11 位后面接了一个 11。
然后就设 f(a,x)f(a,x) 表示把 aa 中集合里的数全部加上 xx,容易发现只需要记录 xmod4xmod4,转移直接递归,把这一位弄掉即可。可以分析复杂度一定很小,因为每次 ai+xai+x 如果是奇数,那么贡献确定了。
题解说明这个复杂度是 O(nlogA)O(nlogA) 的。
ARC162D Smallest Vertices
考虑拆贡献,对于每个点求出合法的方案之和。
考虑这个点的子树都是大于 ii 的,设子树中不包括它的点为 SS。
那么根据 prufer 序列可以得知,一个大小为 NN 的有根树的方案就是,
把 ii 这个子树看作一个 d=0d=0 的点,答案就是:
直接设 fi,j,kfi,j,k dp 即可,需要单独处理一下 di=0di=0 的一些位置。
Odd Sum Rectangles
特别牛的构造题。
感受一下,我们直接分治构造,每次选取矩形中点。
然后分成四个矩形递归构造。
为什么是对的呢?我也不知道。
ARC162E Strange Constraints
记 ci=∑nj=1[aj=i]ci=∑nj=1[aj=i]。
对于两个数 i,ji,j,若 ci<cjci<cj,那么 ii 的可行选取位置构成的集合一定包含 jj 的这个集合,这个是显然的,因此,我们可以从次数出现多的开始考虑,这样子当前能填的空位就确定了。
具体的,设 fi,j,kfi,j,k 表示填完了 [i,n][i,n] 次数的点,一共有 jj 种数,其中占用 kk 个位置,那么转移显然是枚举 ii 次数填了多少次,记 xx。
考虑如何从 fi+1,j,kfi+1,j,k,转移到 fi,j+x,k+ixfi,j+x,k+ix,设 S=∑nj=1[aj≥i]S=∑nj=1[aj≥i]。方案首先就是选取这 xx 个数的数是什么,就是 (S−jx)(S−jx),然后在把这 ixix 个数填进去,先选取位置,再多重集组合数分配即可。
可以发现 ix≤nix≤n,而且 jiji 也一定 ≤n≤n,否则 ff 的值一定为 00,因此可以说明复杂度为 O(n3)O(n3)。
AGC067C Divisibility Homomorphism
条件 1: 存在一个数 CC,满足 ∀1≤n,an≤C×n∀1≤n,an≤C×n。
条件 2: 对于任意两个正整数 n,mn,m,an|aman|am 当且仅当 n|mn|m。
我们需要找到满足条件的 aa 符合什么更加有力的条件。
设 PP 为素数集合。定义,vp(x)vp(x) 表示 xmodpi=0xmodpi=0,的最大的 ii。
首先,显然 2f(u)≤f(2u)2f(u)≤f(2u)。
如果 f(2n+1)=bnf(2n)≠2f(2n)f(2n+1)=bnf(2n)≠2f(2n),那么 bn>2bn>2,由于 an≤C×nan≤C×n,所以 bn≠2bn≠2 的位置是有限的。
所以存在 n1n1,满足 n>n1n>n1 的情况下,f(2n+1)=2f(2n)f(2n+1)=2f(2n)。
同理,存在 N1,c1N1,c1,满足 n>N1n>N1,f(2n)=2n−c1f(c1)f(2n)=2n−c1f(c1)。
引理 1: 对于 pi∈Ppi∈P,有 f(pix)f(x)≥pif(pix)f(x)≥pi,且存在 Ni,ciNi,ci,对于 n>Nin>Ni,满足 f(pni)=pn−ciif(pcii)f(pni)=pn−ciif(pcii)。
证明:
我们已经推出了 22 的情况。
考虑数学归纳法。
假设对于 p1,p2,⋯,pk−1p1,p2,⋯,pk−1 都满足条件,设 MM 为 p1,p2,⋯,pk−1p1,p2,⋯,pk−1 的若干个数的乘积。
那么 pkx∤Mxpkx∤Mx,可以推出 f(pkx)∤f(Mx)f(pkx)∤f(Mx),也就是 f(pkx)f(x)∤f(Mx)f(x)f(pkx)f(x)∤f(Mx)f(x)。
我们令 M=∏k−1i=1pitiM=∏k−1i=1piti,并使 ∀i<k,vpi(f(ptii))≥vpi(f(pkx))∀i<k,vpi(f(ptii))≥vpi(f(pkx))。
那么 ∀i<k,vpi(f(Mx))≥vpi(f(ptii))≥vpi(f(pkx))∀i<k,vpi(f(Mx))≥vpi(f(ptii))≥vpi(f(pkx))。
由此,∀i<k,vpi(f(Mx)f(x))≥vpi(f(pkx)f(x))∀i<k,vpi(f(Mx)f(x))≥vpi(f(pkx)f(x))。
根据上面需要满足 f(pkx)f(x)∤f(Mx)f(x)f(pkx)f(x)∤f(Mx)f(x),所以至少存在 i≥ki≥k,满足 vpi(f(pkx)f(x))>vpi(f(Mx)f(x))vpi(f(pkx)f(x))>vpi(f(Mx)f(x))。
所以,vpi(f(pkx)f(x))≥1vpi(f(pkx)f(x))≥1,所以 f(pkx)f(x)f(pkx)f(x) 含有 ≥pk≥pk 的质因子。
由此,根据 22 的情况的类似推导,我们证明了结论。
引理 2: 若 pp 是质数,p|f(px)f(x)p|f(px)f(x)。
反证。
假设 f(px)=tf(x)f(px)=tf(x),vp(t)=0vp(t)=0。
设 tf(x)tf(x) 中不包含 pp 的质因子为 p1,p2⋯,pkp1,p2⋯,pk。
设 M=∏ki=1ptiiM=∏ki=1ptii。并且满足 vpi(f(ptii))≥vpi(tf(x))vpi(f(ptii))≥vpi(tf(x))。
那么 vpi(f(Mx))≥vpi(f(ptii))≥vpi(tf(x))vpi(f(Mx))≥vpi(f(ptii))≥vpi(tf(x))。
对于 pp 这个质因子,vp(f(Mx))≥vp(f(x))vp(f(Mx))≥vp(f(x)),因为 vp(t)=0vp(t)=0,所以综上可以得到 tf(x)|f(Mx)tf(x)|f(Mx)。
所以 f(px)|f(Mx)f(px)|f(Mx),与 p∤Mp∤M 矛盾,于是得证。
引理 3: 对于 vp(x)<vp(y)vp(x)<vp(y),有 vp(f(x))<vp(f(y))vp(f(x))<vp(f(y))。
反证。
设存在 x,yx,y,满足 vp(x)<vp(y)vp(x)<vp(y) 但是 vp(f(x))≥vp(f(y))vp(f(x))≥vp(f(y))。
我们取出来一对 x,yx,y 满足情况,需要保证 yy 是满足情况最小的。
pvp(x)+1|y⇒f(pvp(x)+1)|f(y)⇒vp(f(pvp(x)+1))≤vp(f(y))≤vp(f(x))pvp(x)+1|y⇒f(pvp(x)+1)|f(y)⇒vp(f(pvp(x)+1))≤vp(f(y))≤vp(f(x))。
如果 y≠pvp(x)+1y≠pvp(x)+1,由于 vp(pvp(x)+1)>vp(x)vp(pvp(x)+1)>vp(x),且 yy 是最小的满足情况的数,所以 vp(f(pvp(x)+1))>vp(f(x))vp(f(pvp(x)+1))>vp(f(x)),与上述不符。
所以,y=pvp(x)+1。
设 a=vp(x),则 y=pa+1,x=paB。
设 f(y) 除了 p 的质因子构成的集合为 p1,p2,⋯,pk。
设 M=∏ki=1ptii,并且满足 f(y)|f(xM),与 y∤xM 矛盾,由此,得证。
这样我们就找到了题目的等价条件,直接做即可。
AGC066D A Independent Set
首先我们可以考虑最后的答案数组,一定是若干个 ABABAB
的连续段中间用 B
连接起来的。
考虑 dp,设 fi 表示现在确定了前 i 位的答案,那么这一位可以填 B
,就从 fi−1 转移过来,如果是一段 ABABABABAB
之类的,就直接枚举 j 满足 [j+1,i] 合法,然后从 fj 转移过来。
假设 j,j′(j>j′) 都是合法的,我们只需要转移 j,因为 [j′+1,j] 也是合法的一段。
所以这样子转移就可以做到 O(n) 了,观察一下这样的极小段有什么性质。
我们现在需要求 w(l,r) 表示 [l,r] 所有 A
排到与 l 奇偶性相同位置的答案。
设 di 表示前缀和,那么答案就是 ∑|di−1−dpi−1|,其中 pi 表示 i 号位置的匹配的点的位置。
听说可以直接暴力二维数点求,但是可以观察一下性质。
由于 [l,r] 这里是极小段。所以我们发现 i 要么全部大于等于 pi,要么全部小于等于 pi。这个性质的具体证明可以考虑反证,即如果存在一个不是这样的匹配方案一定能调整成这样子。
所以可以把绝对值移成 |∑di−1−dpi−1|。
直接维护前缀和即可。
CF1893E Cacti Symphony
先考虑边的限制,相当于两个端点的权值不能相等,且异或和不为这条边。
手玩一下,可以发现有一个端点一定与这条边相等,这是显然的,我们设 x 与这条边相等,那么连单向边 (x,y)。
考虑点的限制,这个点的出边的权值的异或和要么是本身要么是 0,这无关紧要,我们只需要让剩下的边异或和不为这条边就行了,考虑 1⊕2⊕3=0,所以若存在偶数个这样的边,最后异或出来要么是本身要么是 0,不合法,所以相当于入边只能有奇数条。
现在转化成了两个问题,分别是边定向以及使得任意两个点的点权不同。
先看点权不同。
我们注意到这是一个仙人掌,即一个桥连接两个环,显然可以把每个环单独看,然后乘起来,最后乘上 23 的桥数次方即可。一个环的方案。
这个是经典问题,我们可以设 fn,注意到当 n>3 满足 fn=fn−1+2fn−2,理解的话就是考虑 n 和 n−2 的颜色关系。然后搜一下发现 fn=2n+2×(−1)n,需要特判 n=1 的情况。
边定向。
我们可以把边翻转,相当于要使得出度为奇数。所以根据奇数乘法奇偶性不变,nmod2=mmod2 才有解。
我们发现,对于每一个环,把它定向之后,剩下的边确定了,所以这里的方案就是 2 的环数次方。
坑:
- 附加边很大,加起来要注意一下。
- 每个附加边都有 3 的贡献需要算。
- 附加边可能会出现桥的情况。
[JOISC2020] 首都
更深的理解点分治!
首先,考虑暴力怎么做,枚举每一个点,然后使用一个队列。
每次取出队头,看这个点的父亲有没有加入,如果没有,就直接加入与它父亲颜色相同的所有点。
这样子做显然是 O(n2)。
我们考虑点分治,每次只对分治中心和子树连通块做这个东西,我们发现它一定会计算到答案。
这是因为任意一个在最优解中的点,在最早一定会存在一个点被遍历,这个时候所有剩下的点都没有被删除。于是 O(nlogn)。
坑:
- 记得找重心的时候,mx 数组要清零。
- 注意
vector
的清空之类的。 - 要判断当前情况时候把所有这种颜色的点放了,否则这种方案显然是错误的。
[JOISC2020] 最古の遺跡 3
神计数题。
我们先考虑如何给定 h 求出最后的 h′ 数组。
考虑从后往前做,令 h′i=hi,然后判断 [i+1,n] 的 h′ 数组是否存在 h′i,如果存在,则让 h′i→h′i−1。反复进行这个操作,最后得到的就是答案。
考虑 dp,设 fi,j 表示后 i 个数,目前 h′ 数组中 [1,j] 都是出现过的,其它也可能出现,保证 j+1 没出现过。
我们把相同的数看成不同的,即分配标号,这样子方便计数,最后再除以 2n 即可。
设 s 为 [i+1,n] 需要留下来的数的数量。
如果这个位置不需要留下来,那么我们显然是要填一个 [1,j] 的数,原本填了 j+n+n−i−s 个,现在剩下 j−(n+n−i−s) 个,方案就是这么多。
如果这个位置需要留下来。分两种情况考虑。
-
如果当前这个位置填的数会在以后才有用处,就贡献待算,fi,j=fi+1,j。
-
否则,枚举 k 表示当前我们填的数是 j−k+1,即把 [1,j−k] 和 [j−k+2,j] 拼接起来,显然从 fi+1,j−k 转移过来。
这样子的话。我们考虑要钦定前面的 k−1 个位置,相当于 (s−(j−k)k−1)。
然后这个位置可以填 [j−k+2,j] 的数以及,j−k+1 这个数两次,所以这个位置的方案是 k+1。
注意我们还需要算上 k−1 的合法序列的答案,意思就是有 2(k−1) 个数,构成一个 k−1 的序列,问操作这个序列变成排列的方案数。
我们需要观察一下这个问题,首先考虑序列合法必要性,相当于要满足 ≤i 的数的个数 ≤i。否则一定不合法。考虑充分性,其实发现它一定优于排列,而排列一定合法,所以这样的序列也一定合法。
这个就很好 dp 了,直接设 gi,j 表示 i 个数目前填了 j 个位置。
总的时间复杂度 O(n3)。
坑: 注意 j 可以取到 0。
AGC019F Yes or No
首先,最优策略肯定是,哪个剩下的多猜哪个。
我们策略是已定的,每次我们只会往着红色线的方向走。
然后考虑答案序列是怎么样的。
容易观察到,不在这个斜线上的贡献,一定是 max(n,m),你可以试一试,证明就是折一下。
然后剩下的就是过这个斜线的贡献,我们考虑算出 (0,0) 到 (n,m) 跨过斜线的次数总和,这个可以直接枚举每一个点,然后分两部分计算方案乘起来。
由于我们最优策略肯定是 12 的概率选对,所以算出这个东西除以总概率并且乘上 12 就是这部分的期望,两部分加起来即可。
大概就是
gmoj 8248 冲突
设 di 表示位置 i 影响的点的个数,我们注意到 ∑mi=1di=O(n)。
于是考虑根号分治,首先对于 di≥B 的位置,直接暴力,复杂度 O(n2B)。
考虑 di≤B 的位置。考虑建虚树,我们注意到这个时候能够产生贡献的点对一共有 O(nB) 个,直接枚举这些点,然后就判断关系了(因为你就知道了它们的 lca),然后就是矩形加,需要容斥一下,这样就做完了。
注意到一共有 O(nB) 个矩形加,O(Q) 次询问,所以可以直接使用 O(1)−O(√n) 的分块维护区间和。
求解 lca 转化为 RMQ 问题即可。
取 B=√n,总复杂度为 O(n√n),设 n,q 同阶。
坑:
- 注意一共有 n+1 个点。
- 建虚树的时候需要把这个点父亲弄上去。
gmoj 8249 最大流
考虑一个面我们最多经过 2 个边,而且不会只经过一个边。
可以说明,如果经过这么面,一定会经过最小的那条边。
所以我们考虑一个贪心,先把环上的边加入堆,每次取出最小的,设其权值为 e,把它的那一个面取出来,让这个面其它的边 +e 权值,然后丢进堆里。
这样子最后会形成的结构恰好是最小割树,直接做即可。
现在目的是怎么找到这个面上的其它边,我们对这个图建对偶图,对偶图一定是一个树。具体的,从前往后扫每个点,用单调栈维护目前的连边情况,每次取出这个点的一条边,与单调栈的某些边就形成了面,记录一下就好了,然后就持续维护这个单调栈即可。
坑: 一定要取模。
AGC068B 01 Graph Construction
连 1800 都想不到,废了。
一个可行的思路是,让 0 的位置尽可能合法,然后考虑 1 的位置。
如何使得 0 的位置合法,那肯定是复制。
直接讲构造。
枚举 i 从 1 到 n,每次找到 ai 在当前序列 a′ 的第二次出现位置,或者最后一次出现的位置(如果没有第二次),然后把这个位置删掉,变成 a′。
比如说:32332。
先考虑第一组,0010011111。
然后序列变成 3232,我们现在需要利用 0 来进行复制。
于是第二组,00010000。这样子很好的把第一组的信息转移了下来。
然后序列变成了 323,第三组就是 001000。
以此类推。
观察到这种构造方法,很有效的传递的信息,使得复制的新一份数组与原数组恰好一一对应。
对于 1 来说,我们可以发现,这样子一定会合法的连向上一个的位置,且第一个会连向最后一个位置,所以合法。
这道题目的主要思考突破口是,先考虑 O(n2) 的构造,然后我们要仔细手玩一下,并且观察一下 0 的可以进行复制操作。
AGC068A Circular Distance
钦定 0 一定被选上,求出这个,把它乘上 Ln。相当于每个人都钦定一次,一个选 n 人的方案有 n 种钦定方案。
现在考虑求出 cost
<D 的方案数 f(D),求出之后就可以很好的解决问题了。
首先,[D,L−D] 这个区间的人是不可以选择,我们假设 [1,D−1] 乱选,剩下的就是 [L−D+1,L−1] 这个区间。
注意到,选某一个 i∈[L−D+1,L−1],我们不能选 [i−L+D,i−D],恰好覆盖着 [1,D−1] 这个区间的一部分。
注意这个不能选的区间的长度是定值,设为 w=L−2D+1。
考虑把问题转化为,在一个长度为 [1,D−1] 的序列中,选择若干个白点,相当于原序列的 [1,D−1],然后选一些黑点,相当于原序列的区间限制,要使得黑点开始的 w 长度不能有白点。
现在就好做了,我们先枚举白点和黑点的颜色段总数 k。
有两种情况,WBWBWBWB
或者 BWBWBWBWB
。
那么先把需要留下来空白位置的点数减掉,剩下的直接选,然后直接插板 B,W 的方案数。
可以发现,颜色段数是 O(nD) 级别的,所以总复杂度 O(LlogL)。
坑: 对于 L−2D+1<0 的话,我们直接任选 n−1 个点即可。
AGC068C Ball Redistribution
先考虑建图,我们连边 i→ai。
手玩一下,对于一个操作 i,我们会把 i 的所有入边删掉,然后这些点构成一个环。
一些性质:
- 如果点 i 不含自环,那么操作之后,i 一定在链上。
- 如果点 i 含自环,那么操作之后,i 一定在环上。
只关注 i=N 这个操作,逆推考虑。
如果 N 在环上,那么上一次操作 N 一定有自环,那么操作完不可能有两个点连向它。
如果 N 不在环上,那么上一次操作 N 一定不含自环,那么操作完不可能有点连向它。
所以,得出结论,充要就是没有任意除了环上的点连向 N。
考虑扩展到 i=n−1→1,就很抽象了。
下面给出充要条件,然后证明,具体思考过程感觉很需要猜啊!
充要条件:对于一个点 u,设 v1,v2,⋯,vk 表示 u 的 k 个儿子,那么要保证 v1,v2,⋯,vk 的每个子树的结点编号最大值要大于 u。(儿子指的是不在环上的)
必要性:选择一个结点 v,它不满足条件,还有它的儿子 u。我们发现,无论怎么操作 n→v+1,u 的子树都不会变,所以最后 v 会有一个 u 这个结点,显然不能逆推了。
充分性:手玩容易发现,操作之后限制会变更松。所以可以构造一组解。
AGC068E Sort and Match
考虑从 yi 向 xi 连边,我们发现,这个图每个点的入度等于出度,这启示我们考虑欧拉回路。
考虑从 1 号结点游走,每次经过一个我们没有经过的出边,然后类似操作,最后回到 1,然后对 [2,n] 也做类似操作。
我们发现,每一个钦定出边的顺序,恰好对应了原题中一个 xi 的顺序,所以上面这个过程与这个题构成了双射。
于是,直接设 fi,j,k 表示走了 i 步,目前是从 j 这个结点游走的,到了 k,显然需要满足 k≥j。
然后就可以枚举下一步转移。
由于题目有 x1=k 的限制,所以就直接倒着 dp,然后枚举 x1 是什么贡献到这个答案即可。
时间复杂度 O(n4)。
gmoj 8298 冒泡排序
我只能说,题解就是**。
一个很厉害的一步,先把偶数位置乘上 −1。
现在问题转化成,每次可以交换相邻两个位置,最后要求:
- 对于奇数位置,要满足 ai+ai+1≤0;
- 对于偶数位置,要满足 ai+ai+1≥0。
而且,原序列一定是负的很大值到 0 到正的很大值,由此,
一定存在一个 p,满足
- ∀i∈[2,p],|ai−1|≥|ai|,且 ai−1 和 ai 的符号不同。
- ∀i∈[p+1,n−1],|ai|≤|ai+1|,且 ai 和 ai+1 的符号不同。
所以我们考虑按绝对值从大到小填数,每次填绝对值相同的一些数。
设 fi,j,k 表示填了 ≥i 的数,目前左边是负号,右边是正号。
转移的话,直接枚举有多少个数去到左边,其它去到右边,由于正负交替,容易算出其数量,而且,我们容易知道,对于正的数,其一定是不改变原先顺序的,负的同理,所以可以确定每一个数具体放在哪个相对位置。
考虑如何算贡献,贡献有几类:
- 一种是比 i 小的数,那么我们移动当前数,一定会有位置在它前面的数的贡献,这个可以直接记录一下前缀和和后缀和。
- 一种是可能会出现交叉的情况,具体的,我们需要把向左的数看成 1,向右的数看成 0,那么就需要加上 1 左边 0 的数量,0 右边 1 的数量。
- 一种是对于都向左的正和负,可能会产生贡献,这部分也可以直接求一个前缀和后缀和。
上面这三种都可以使用 BIT 维护。
总的时间复杂度 O(nlogn)。
坑:
- 初始化要注意,如果 n 是偶数,那么两边第一次都只能填负数。如果 n 是奇数,则一边填负数一边填正数。
- 清空直接的 BIT 记录的时候,最好使用栈存下来 + 的位置。
- 注意一些边界,不要使得
vector
越界了。
gmoj 8265 见证者
首先,n×m≡1(mod2) 无解。
我们先让 m 变成偶数,然后对网格图进行黑白染色,匹配边的两端颜色肯定不同。
建立矩阵 G,满足 Gi,j 为 1 当且仅当左部的 i 到右部得 j 有边。
二分图完美匹配,相当于这个矩阵的积和式,难以计算。
下面我们说明,把竖着的边的权值变成 i=√−1 即可,直接求出行列式即可。
我们先钦定 Li 和 Ri 的边被选中,如上图。
然后考虑在网格图上随意加入一个完美匹配,我们发现,会形成若干个环,显然这个环是 i→pi 的边和选中的边交替形成。
容易发现,一个点会回到自己,所以环里面竖边的数量一定是偶数,同理,环里面被选中的边,和其余的横边数量之和也是偶数,所以环的大小一定是偶数。
行列式的 (−1)σ(p) 相当于 (−1)n−cyc(p),而且 n 是偶数,可以不考虑。
我们现在想要抵消掉 (−1)cyc(p),只需要每个环的 i 的乘积是 −1 即可。
那么指数肯定是 4k+2 的形式,只需要证明竖边 12 是奇数。
观察上图,我们发现奇数行和偶数行的选中的边的关系相反。
考虑从一个点行号最小列号最小的点 u 出发,绕着环走回到该点。显然最下方的方向与最上方的方向相反,于是,竖的差为奇数,由此得证。
观察到 i≡86583718(mod998244353) 所以直接行列式就可以 O(n6)。
我们考虑主元法,具体的,把每一行都消到只有 (1,1),(1,2),⋯,(1,m′),(i+1,j) 一共有 m′+1 个变量(这里指的是矩阵的坐标)。
我们用这一行去消 (i+1,j−1),(i+1,j+1),(i+2,j) 这三个行即可。
最后,我们发现对于大于 n−m′ 的这些位置,只有 (n−m′,1)→(n,m′) 有值,直接对这部分高斯消元即可,剩下的就是一个对角线乘起来,注意要计算逆序对数量。
每一行我们存一下前 m′ 个位置和下方那个位置。
可以做到 O(n3)。
gmoj 8269 基础NPC练习题
对于前两个点,直接做。
第三个点,直接乱模拟退火。
第四个点,直接钦定 ci,j=Cj−i。
第五个点,直接钦定 ci,j=Cj−i=Cn−(j−i)。
第六个点,发现 n=n′×3−1。直接把第五个点的 C 拓展一下即可。
即 [1,n′−1] 使用 C,[n′,2n′−1] 使用 5,后面也使用 C。
gmoj 8273 词典
考虑一个想法,我们把每一个 s 串分成若干个子串,使得这些串是 t 的子串,并且使得相邻两个这种串并起来不是 t 的子串,下面称为段。
然后,我们可以证明,两个串合并的时候,只需要考虑中间的四段。
由于这些段都是 t 的子串,所以我们可以猫树分治预处理一些信息,使得每次查询从 AC 自动机的 st 号结点出发,经过 t[l,r] 的最终位置和权值。
但是两个串合并的时候,可能会中间两个并在一起,此时我们可以证明还是只需要考虑之前的那几个段,所以我们只需要维护每一个串前两个段后两个段即可。
猫树分治,可以对于每一个 st,存储一些东西,然后我们先遍历小区间,把初始位置全部求出来,就可以更新大区间了,这个就很想倍增。
总的时间复杂度就是 O(|T|2log|T|+|S|+q)。
实现细节较多,很繁琐。
gmoj 8270 暴力
考虑令 x=aaaa⋯。即 a 的幂塔,这显然合法。
所以我们只需要求出这个值 modlcm(n,φ(n))。
所以考虑求出这个值 modn,modφ(n) 的值,然后 exgcd 合并。
现在只需要求出幂塔 modp 的值。
可以递归处理,求出幂塔 modφ(p)+φ(p) 的值,然后快速幂一下。
这样子复杂度是很小的,可以算一下。
gmoj 8271 XYH和AEY的染色游戏
注意到,直接设 fi,j,0/1 表示左边有 i 个颜色已经定了,右边有 j 个颜色已经定了,上一次操作的是左边还是右边,那么这次就必须反过来。
容易发现,转移枚举 k 表示新增的颜色,然后贡献是一个类似平行四边形的东西。
由于 v 随机,直接让 k≤B 即可,B 是一个常数。
gmoj 8272 构造
考虑 a+b=(a⊕b)+2(a∧b)。
那么前面那个容易发现,前面那个数的 1 连续段中最多包含第二个数的一个 1。
所以,考虑构造出一个东西,使得前面那个数异或上这个东西实现进位。
相当于要把连续段的从第二个数 1 开始的位置变成 1。
可以考虑倍增,然后注意不能越过 0,所以需要对 0,1 都倍增。
最后左移一下或上自己就是构造的东西。
是 O(logn) 级别的。
gmoj 8276 醉人的葡萄酒
先特判 A=1 或者 B=1。
对于每一位单独考虑。
考虑 A=2 且 B=2 怎么做,我们发现,每一行的异或和和每一列的异或和都不变。可以证明,设 x 表示行异或和等于 1 的数量,y 为列的这个数量,答案就是 max(x,y)。
我们定义一个四元操作,表示在原矩阵中选择相同的数操作 (x,y),(x+1,y+1),(x+1,y),(x,y+1) 这四个位置。其中操作某个位置表示把以它开头的 A×B 的矩形异或上一个数。
那么这么操作,会使得 (x,y),(x+A,y),(x,y+B),(x+A,y+B) 这四个位置异或上一个数,其它位置不变。
考虑 x,y 对于 A,B 的同余系,构成了 A×B 个矩阵。
由于我们可以归纳,所以可以转化到第一行第一列,剩下的部分就直接做 A=B=2 的情况。
复杂度 O(2n−A+m−B+1ABloga)。
gmoj 8268 基础数论练习题
考虑 min-max 容斥,转化为求一个素数集满足这个集符合条件的期望最小时间。
设选出来的素数集为 S,p=∏i∈Spαi+1i,那么当前的期望就是 E=1+⌊np⌋nE,可以解出 E,当然这个不是最终的次数,最后我们需要选取一次,次数还需要 +1。
观察到若 m=1,那么容斥系数为 −μ(p)。
注意到,在狄利克雷卷积下,μ(x)=∏(1−xp)。
于是考虑拓展 μ 的定义,设 μ′(x)=∏(1−xpα+1)。
我们发现这个多项式的第 p 项取反恰好是 p 的容斥系数。
现在可以直接对 p 整除分块,相当于求出 μ′ 的前缀和,注意到,我们只需要算出上界是 ⌊nx⌋ 的前缀和,设 s(x) 表示前者。
所以,先对 μ 算一次,然后每次我们相当于需要乘上或除上一个 1−xk。
观察到这个很像狄利克雷前缀和。
对于乘法,只需要让 s(x) 减去 s(xk) 即可,对于除法,只需要让 s(x) 加上 s(xk) 即可(要反过来)。
所以时间复杂度就是 O(n23+(√n+w)logn)。
坑: 使用杜教筛的时候,最好不要用 map
,还是直接用两个数组存储就行了,因为查的点值一定是 ⌊nx⌋。
gmoj 8313 交换比特
设 pi 表示 i 最后的位置。
考虑把 i 到 pi 连边,观察图的形态是怎么样的。
我们发现,图由若干个环组成(废话),且每一个环,都是形如,
即,一个点出去到达若干个点,回来的时候必须得把没有经过的点经过。
首先枚举 C∈[2,n−1],那么设 fi,j,gi,j 分别表示前 i 个已经闭环了,没有闭环且 i−1 这个位置不知道谁连向它的方案,j 表示目前长度等于 C 的个数。
注意,这里的 gi,j 计数的是长度大于等于 3 的环,即自环和二元环我们需要自行讨论。
那显然,fi,j=fi−1,j+fi−2,j+2gi,j,其中 2 表示钦定顺序。
然后 gi,j=∑fk,j−[i−k−1=C]+gk,j−[i−k+1=C]。
类似的,若 C=1,我们就把状态改为长度不为 1 的,这样子方便一点。
我们注意到 j 最多只有 iC−1,所以可以做到 O(n3lnn),使用前缀和优化可以做到 O(n2lnn)。
gmoj 8314 树上排序
很神奇的题目。
我们先考虑如果从上往下做怎么做,显然,直接每次找到子树内相同的换即可。我们可以说明,若这个操作不合法,那么原题不合法,否则合法。
于是,我们现在需要调整。设上面那个问题 i 需要跟 toi 变换。
依次枚举 i,每次我们相当于要把 i,toi 先交换,考虑指向 i 的点和指向 toi 的点。
显然,指向 i 的点会指向 toi,指向 toi 的点且为 i 祖先的点会指向 i。
我们对与每个结点,以深度建立平衡树即可维护,注意要实时维护 toi,由于 i 是按顺序的,因此,只需要每次更改平衡树根的时候记录一个编号最小值更新一下即可。
Chodzenie po linie
首先,我们肯定是把它分成一段一段做,然后段与段之间是不能互相到达的。
对于一个初始点 x,我们肯定是找到其上边最左的点,其右边最下的点,然后过去,所以,我们发现,可以用二元组 (x,y),注意这分别都是点的编号,来维护目前可以到的矩形。
我们考虑左下的不可到达点,右上直接翻转序列再做一遍即可。
考虑把 dis(x,y),拆成枚举一个 k,求有多少个 dis(x,y)≥k。
那么每次我们相当于一个左下的矩形不能到达,直接二维数点即可。
直觉上告诉我们这个走的过程总次数很少,事实上是 O(n√n) 的,现在我们来证明。
记 B=√n。
对于经过的点对 (x,y),总有 x<y,px>py(起始点除外)。
对于某个 x,我们取出所有满足 x<y 的 px>py 的 y 并按照 py 排序,记为 bx,1,bx,2,⋯,bx,k。
我们称 (x,bx,1),(x,bx,2),⋯,(x,bx,B) 是好点,其它是坏点。
考虑从 (x,y) 开始走,每次经过一个坏点 (x,y) 下一次 y 一定会变成 bx,1,因此 py 至少变小了 B,而整个过程 x+py 是不升的,所以至多经过 nB 个坏点,同时好点的总数不超过 nB,所以总的点数是 O(n√n) 的。
我们可以直接把一个二元组到达的二元组连边,变成一棵树,直接在上面做一个累加即可计算答案,但是这样子常数很大。
我们注意到,对于同一个 x,若干个 y,这些二元组的到达的二元组是 y 递减的。
所以直接对于每一个 x 维护一个 vector
然后每次看一下末尾元素是否相同就可以判断插不插入了,这样子就可以快速把树建出来。常数非常小!
二维数点一共由 O(n) 次插入,O(n√n) 次查询,所以使用 O(√n)−O(1) 的分块即可。
gmoj 8300 最短路
终于过了!
我们考虑先求出最短路,然后修改边权,即,将 (u,v,w),变成 (u,v,du+w−dv)。
我们考虑那么每次我们相当于要将最短路树上 1 到 u 的路径反向,然后求 1,u 在新图的最短路,最后加上最短路乘以 2 即可。
注意到,新图有什么性质呢,我们发现最短路树上的边都为 0。
考虑设 fu 表示第二次的最短路,那么每次我们考虑取出一个最小的 fu,进行转移。
显然,如果存在边 (u,v,w) 且满足这条边不在最短路树上,那么,可以直接转移到 fv。
其次,我们把这个点出发分成若干个连通块,我们考虑从连通块转移到连通块,如果存在 (x,v,w),满足 x,v 不在一个连通块,那么可以 fu 转移到 fv。因为可以直接走到 x 号点。注意到,这样的边是只会被计算一次的,所以用完就删了。
那么我们每次相当于分治递归到若干个连通块继续做。
注意到这个过程,我们每次可以不取出最大的那个连通块,然后把单向边存在两个点,分别都转移一下。
这样子复杂度就类似 DSU on tree,即可通过。
讲一下实现细节,我们使用并查集维护出边,这样子保证复杂度,就相当于如果 i 以后不会遍历了,就连边 (i,i+1)。
然后直接多路 bfs 即可,可以做到 O(nlogn)。
还有一种更好写的做法,直接枚举倍增点的数量,如果走完了就相当于这个不是最大的,这样子是 O(nlog2n) 的。
可能我写的太丑了,O(nlogn) 常数很大。
gmoj 8312 三重数
我们肯定是从左到右用栈去维护,栈最后一定为空。
暴力做法,就是我们考虑建成一棵树,我们发现可能会算重,什么情况会算重,就是前面合法了,转化到树上就是相邻两个结点的权值不同。
于是,我们设 fi,gi 分别表示树和森林的方案数,还需要记录一下前导 0,还有是否有不同权值这种东西,直接 O(n2) 转移,没有前途。
我们把一个栈空到栈空的过程称之为关键步骤,那么总序列肯定是由若干个关键步骤构成。
于是设 F 表示钦定第一个数确定的关键步骤的生成函数,根据暴力的树的一个性质,可以得到,F=x(11−9F)2。
而我们需要求 [x⌊L3⌋]11−x9F1−10F。
注意到,F 的复合逆为 G=x(1−9x)2。
令 H=11−G9x1−10x,则所求的是 [x⌊L3⌋]H(F)。
使用扩展另类拉格朗日反演,可得 [xn]H(F(x))=[xn]H(x)G′(x)(G(x)x)−n−1=[xn]9x((1−9x)2−18x(1−9x))(1−10x)(1−x(1−9x)2)1(1−9x)2(n+1)。
后面那部分是插板法,前面直接对比系数即可。
gmoj 8296 异或幂和
考虑展开 k 次方,相当于要选择若干个数 c1,⋯,cl,然后计算这些数的贡献。
直接枚举不太可行,我们考虑分块,把 30 分成 8 块,每块 4 个数。
我们先枚举分别在哪些块,只把这些位置抠出来,得到一个 216 的数,然后做异或卷积,并且做一个高维后缀和。
那么如果我们已经定了选哪些数,就可以 O(1) 得到这个贡献了。
于是,此时再枚举每一个块选了哪些数即可。
gmoj 8293 黑箱博弈
我们注意到,充要条件即为,每一个点被覆盖的区间的种类集合不能相同。
设 fn,m 表示 n 个黑箱,m 个区间的答案,写成生成函数 Fn(x)=∑mfn,mxm。
考虑容斥,那么总的就是 (1+x)12n(n+1),把不合法的减去。
考虑把覆盖种类集合相同的点染上同样的颜色,取出每一个颜色的最左端和最右端,构成一个新区间。
那么我们可以说明,他们构成的区间一定不会相交但不包含,即要不包含要不不相交,反证法即可。
考虑枚举最上层的区间一共有多少个,那么可以把这个问题转化为一个子问题,然后段内部直接任取即可。
具体的,Fn(x)=(1+x)12n(n+1)−∑n−1i=1Fi(x)[yn](∑∞j=1(1+x)12(j−1)(j−2)yj)i。
直接拉格朗日插值即可做到 O(n5)。
gmoj 8328 基础数论练习题
注意到,d(∏ni=1ai)=∑∀i∈[1,n],bi|ai[∀j≠k,gcd(bj,bk)=1]。
考虑对于一个 b,一定是分成若干个质因数集合 S,以及一堆 1,显然 S 中每个数只能出现一次。
那么我们只需要对 |S| 进行 dp,然后算一下组合数就可以算出最终答案,需要 dp 的是 ∏x∈b⌊mx⌋。
然后直接把这个 S 状压即可,把最大质因子的数放在一起转移,然后发现 >√m 是没有用的,稍微剪枝即可做到 O(mπ(m)2π(√m))。
AGC057F Reflection
一定要仔细思考再去写。
我们把 a,b,c 写成 (b−a,c−b) 的形式,另外我们还有一个 b±x 的 x。
我们把二元组写成 (a,b)。
首先观察一下这个图(这个图有问题啊,要往左平移一格),我们发现,一个位置是 (a,b),还是 (b,a),只取决于最后一步是 + 还是 −。
我们先把这个 ±x 的 x 序列求出来,设为 ai,bi,表示 ai 这个数 repeat 了 bi 次。
先考虑转化问题:
我们需要对于这个序列的每一个前缀 i,求出每个数选 + 或 − 的方案数,要求最后到达同一个数只算一次。
注意一下,对于不是 a=b 的位置,我们是钦定最后一步选 + 还是 −,然后对前面的步骤做上面的事情,可以直接对前面的步骤做,然后乘以 2。
这个其实等价于选择若干个数,可以不选,选择的数相当于变成 +,所以其实是一个背包问题。
直接做这个背包问题肯定是不合理的,我们考虑挖掘 ai,bi 的性质。
修改一下上面 a,b 的定义,我们不考虑最后一个 1,把它拎出来单独看作一个数,设一共有 k 种数。
分别有几个性质:
- ∀1≤i≤k−2,ai=bi+1ai+1+ai+2。
- ak−1=bkak+1。
考虑怎么计数才能不会算重,我们发现,如果 ai+1 全都被选了,ai+2 也选了至少一个,且 ai 还没有全部被选,显然可以把 ai+1,ai+2 转化成 ai。即,如果 i 没有全部被选,i+1 全部选了,那么 i+2 不能选,这样子就可以保证计数是合理的。
最后我们还需要算一下含有最后一个 1 的情况,我们可以说明,答案就是前面的方案 +1,因为只有在所有数都选择的时候才会产生贡献。
我们可以先用 dp 求出不考虑最后一个 1 的这个后缀的方案,设为 s。
那么最后一个 1 的情况有 2(s+1) 种。
然后再用 dp 算出除了 a=b 的答案,比如说,对于序列 7,3,3,1,1,你需要计算 ∅;7;7,3;7,3,3 这些的贡献,对应到原问题就是 7,3,3,1 的每个前缀的贡献,注意要乘以 2,然后加上 7,3,3,1,1 的贡献 s,这个只用算一次,最后加上初始的一种,就是答案。
所以我们第二次 dp 的时候需要把最后两个数剔除。
时间复杂度与辗转相除法类似,就是 O(Tlog(C−A))。
gmoj 8237 Permutation
考虑 dp,设 fi,S 表示前 i 个目前构成的数为 S,每次新增一个数直接计算贡献。发现状态数很少,直接 unordered_map
即可。
gmoj 8238 jewel
考虑设 fS,i,j 表示目前还剩下 S 集合里的宝石,其中先手在 i,后手在 j,先手与后手差的最大值,可以显然的转移。
但是我们发现这样子有 S 转移到 S 的情况,这样显然会有问题。
对于 S′ 转移到 S,我们倒着做,直接从小往大枚举 S 即可。
否则,我们先处理出来一个数组 gi,j 表示当前的最大值,即如果一个点的状态已经确定了,在有向有环图中就是无入度的点,就先把 g 当成这些值。
然后,每次我们取出最大的 gi,j,我们考虑用这里的 (i,j) 去更新其它位置,每次我们都这么做,直到 gi,j≤0,就不做了。
分析一下这样做的正确性,我们发现,每一个强连通分块的 f 的绝对值不会大于 max(g),所以我们每次取出最大值一定是对的,而且如果 g≤0 了,那么走出强连通一定会劣,所以这个时候环上的状态的 f=0。
需要去做一下过河卒!
gmoj 8338 百万富翁
我们每次尝试删除一段后缀,具体的,每次随机两个 x,y,然后对所有数问一遍,设 l 为成功的次数,我们想要 y−x+1≤x≤y≤n≤x+y−1。
观察到这个区间长度如果不对 n 取 min 一定是奇数,所以我们可以有 12 的概率获得偶数,并且需要保证 x,y 都在区间内,所以需要满足 l≥23n。
这样子我们就把序列分成了很多段。
然后对于最后一个包含一的段跑暴力,求出 1,2,3。
这个时候就可以考虑分治了,具体的,如果前面分的段在这个 [l,r] 中,就可以直接分治,否则就直接取 mid=min(l+r2,2(l−1)),这样子我们一定能把 [l,mid] 查出来,然后递归下去即可,由于我们知道了 1,2,3,所以这样做是合法的。
这样子还是不能够 AC,我们还需要让前面的部分常数较小,就是如果当前问对的次数比上问的次数已经不太能够使得 l≥23n 了,就直接退出重做。
询问次数 O(nlogn)。
gmoj 8240 玩游戏
我们先判无解,剩下的就是尽量使得两个数一起被操作。
把 =k 看成 1,小于的看成 0,大于的看成 2。
什么时候两个数可以被一起操作,我们考虑连边。(0,2),(2,0) 可以连边。
然后如果是 (0,1,2),(2,1,0),也可以连边 0,2。
那么我们发现最终序列形成了若干个链,相当于我们要求最大匹配,然后用总的 0,2 数量减去最大匹配。
考虑把序列拆分成连续段,当出现 a,a,或者 a,1,a 的时候,就拆分段,我们发现,每一段的内部都是一个链,只需要计算每一段内部的 0,2 的数量除以 2 即可。
这样可以做到 O(nq),显然可以直接对于每一个值域预处理,然后用 set
维护连续段,使用树状数组维护区间 0,2 的数量和,每次值域扩大,相当于修改若干个位置。我们每次修改一个位置最好是把 x−2,x−1,x,x+1 这四个位置后的空隙都判一下。
时间复杂度为 O(nlogn)。常数巨大,需要使用若干个卡常技巧。
坑: 注意修改树状数组的时候答案会变,要更新一下,注意一下先后顺序。
卡常技巧: 树状数组如果查询的区间小,直接跑暴力,会优化 0.1~0.2s。
gmoj 8241 异或
很套路的题目。
我们考虑枚举一个点,枚举半径,要求关键点在圆上,这样子显然是有单调性的,可以二分半径。
现在相当于有很多个圆,对于两个圆,交出一段弧,那么关键点肯定是尽量在端点上。
所以我们就可以把每一个点对应一些区间,然后区间上有权值,现在问题就是,是否存在一个点,每次包含这个点的区间的权值异或和最大 ≥k。显然可以扫描线加线性基,只需要维护一个时间戳即可,每次如果时间戳比原本优,就直接替换。
然后就可以做到 O(n2log2V)。
我们想到一个套路,前缀最大值的期望次数是 O(logn) 的。
所以可以每次判断当前是否能取到之间的答案,如果连之前答案都取不到,那就废了,直接 continue
。否则再进行二分。
这样子时间复杂度就是 O(nlog3V+n2logV)。
ARC170F Edge Deletion 2
考虑一个贪心过程,枚举 1→n,每次到一个点,就对它目前的答案进行贪心。
比如说,一开始我们就在 1 打上待定标记,并且把 1 的出边全部打上这个标记。
我们取出这个点出边中最小的权值或者是最小的待定权值,那么如果是确定的权值,直接把这条边断掉即可,否则就可以确定另一个点的权值。
具体的:
遍历 1→n,对于当前点 i,如果当前点的度数为 1,且有待确定值,那么肯定确定这个待确定值,以保证 i 的答案是 0。
否则,我们在它出边找到一个点 x,满足这个点确定值和待确定值得其中一个比较小,如果是确定值比较小,直接断掉这条边,如果是待确定值比较小,就让待确定的那个点定权值,待确定它得那个点和待确定这个点断边,以及这条边也断掉。
如果找不到 x,就只能在 i 这个位置打上待定标记,把其出边全部打上这个标记。
注意存在一种情况,y,z 互相待定,此时遍历到 x,其中 y 只有 x,z 两条边,这样子我们不能遍历 (x,y) 这个出边。如果最终 z 选了了 y,那么 y 一定只能选择 x,相当于这条边一定会断掉,所以不能考虑这条边。
实现的时候,删边一定需要把当前能确定的点给确定了,否则会出错。
用 set
维护,时间复杂度 O(nlogn)。
AGC048E Strange Relation
设 Bi=Ai+xiT。
我们肯定是对于每一个 i,让 xi 从大到小枚举,如果合法就确定。
显然,不存在 Bj∈[Bi,Bi+T),j<i,否则我们就可以增大 xi 了。
这启示我们,如果我们删掉 i,那么对于 j>i,Bj>Bi 的 Bj,其减去 T 是不会影响 B 的相对顺序的。
由此,加入 i 也是不会影响相对顺序的(此题的重要结论),所以可以枚举是第几个位置 i,枚举它选了啥,然后倒着从 i 往 1 做一个 dp,每次加入一个位置,看一下这个 i 的贡献变化情况。
Jump
首先,考虑问出来一个 T 使得 S 和 T 的相同位置数量为 n2。
考虑我们每次把最左边的 0 变成 1,中间一定存在一个时刻满足情况,感受一下!
然后考虑问出了 T 之后,我们固定一个位置,每次查询这个位置和其他位置,让这两个位置都翻转(0→1,1→0),如果还是 n2,说明这两个位置正确性不同。询问 n−1 次就可以得到每个位置的正确性的相对关系。
那么就可以再使用 2 次操作,这样子的次数是 n+n 的,考虑把前面那个部分换成随机化,即每次随机一个序列,可以证明这样子的次数是优秀的,500 次问不出来的概率大概是 10−6 级别。
Sorting Game
考虑每次让 n→n+1,会发生什么。
我们考虑最左边的 1,和最右边的 0,感受一下,这段区间内 [1,n] 中的数一定要相同,否则我们就一定不能换,剩下的就是子问题啦。
具体来说,考虑枚举上面的区间长度 k,那么可以递归到子问题 n,m−k+1。
还有一种情况是 k=0,也是一个子问题。你观察到这个是一个前缀和优化,于是做完了,时间复杂度 O(n2)。
AGC030C Coloring Torus
挺好玩。
我们考虑如何构造 n=K,可以循环移位:
1 2 3 4
2 3 4 1
3 4 1 2
4 1 2 3
注意到,我们可以替换每一种数的某偶数位,注意需要保证 n 为偶数。
比如说:
1 2 3 4 5 6
2 3 4 5 7 1
3 4 5 6 1 2
4 5 7 1 2 3
5 6 1 2 3 4
7 1 2 3 4 5
这样是合法的,所以我们一定可以构造出 2n 的情况。
ARC141D Non-divisible Set
注意题目给了 a≤2m,这是一个很隐藏的条件。
我们把 ai 表示成 xi×2pi,那么可以说明 xi 只会出现 m 次,而且对于同一个 xi,只能选一次,而且我们要求选 m 个,所以题目就转化了。
考虑对于 xi,xj,pi,pj 同时选的要求,如果 xi|xj,就要满足 pi>pj。
直接从前往后贪心求出一个上界,从后往前求出一个下界即可。
时间复杂度 O(nlnn)。
gmoj 8307 划分
这个题怎么就做不出来啊,卡在了 dp 了。
我们先考虑把已有的连通块的点扩展,这个可以求出每个相同数的 lca,然后直接往上跳,是均摊 O(n) 的。
考虑怎么 dp,我们设 fx 表示目前划分连通块的方案,目前我们是知道这个点的颜色,gx 表示我们不知道这个点的颜色的方案数。
考虑如果一个点是有权值的点,那么 gx=0,fx=∏y∈sonx(fy+gy)。
如果一个点没有权值,那么每次我们可以合并子树,fx←fx(fy+gy)+gxfy,gx←gx(fy+gy)。
这个代表的就是可能会出现前面的不知道的点,过了一会被钦定颜色了。
瓶颈在求解 lca,时间复杂度 O(nlogn)。
gmoj 8258 lxl题
考虑把 x 轴分块,对于每一块处理。

考虑把矩形分成直接跨越一个块的,和散块的。

对于散块,我们在那个块上插入若干条蓝线。

我们发现其为如下结构

我们可以说明,竖线(图中没画出)和蓝线的交点总和是 O(n√n) 级别的。
我们把每一个蓝线离散化(包括询问的),构成了很多竖线和蓝线所构的格子。
我们把每一行,称之为绿线。
我们考虑把 v 从大到小排序,每次面对一个散块,一定是图中某两条蓝线的中间的部分,直接遍历这些格子,用并查集快速遍历,遍历完说明权值已经确定。
我们发现一个格子可能会有整块已经覆盖了,所以当我们遇到一个整块,也对每一行维护并查集,遍历这些绿线,遍历完表示权值已经确定。
可以对于每一个种类的格子(同一蓝线中间),维护几个变量,以助于更新上述信息。
对于查询散块,我们直接查询一个 n×√n 的矩阵的二维前缀和;对于查询整块,我们直接用之前的绿线权值的做一遍前缀和。
时间复杂度 O(n√n)。
坑:
- 要注意散块和整块要互相转移,可能是这么说。
- 要开
long long
。
卡常技巧:
- 感觉线就很抽象,可以直接把两条线中间的部分分别建出来,实际上可以表示为左闭右开的区间,然后这样子就不会带有 2 倍常数了。
vector
不要开 n√n 的空间,可以直接扫一遍 1→n 看是否有交。- B 大概取 0.4√n。
- 并查集和二维的权值数组直接开即可,不要开
vector
。
ARC185
ARC117E Zero-Sum Ranges 2
ARC113F Social Distance
AGC050B Three Coins
01 Inversion Expected
ABC376
以后细节题把思路简单写一下,不要直接写,尽量找比较好写的思路。
如果刚开始没想到不要急,还是仔细想想性质和一些套路。
AGC023F 01 on Tree
10.21
联考一。
今天这场 T1 是大讨论题,以后写之前还是尽量写一下思路,并且手摸几个小一点的样例,今天还是浪费了很多时间。
要仔细分析性质,然后部分分要想着如何拓展到正解。
书店
直接考虑建图,显然如果存在偶环一定有解,但是,如果是 >1 个奇环,一定可以把两个环中间拉一条链,写就完了。
卡萨内
注意 k=3 就是二维数点,想正解也要二维数点。
于是考虑把 k 分奇偶数讨论,然后把原问题拆成两个限制,只要满足最后连边是连通块限制就是正确的,可以发现就是二维数点。
淀粉
首先我们假设已经构成了 r 的每一个儿子子树的森林,考虑如果 T2 的根 r,跟某个子树中的一个点在 T1 上有边,那么显然就连起来了,所以答案就是没有这样的子树的个数。于是可以换根 dp。
服了
我们考虑分治,每次合并两个区间的 1 的个数和前缀最大和。
发现现在的问题就是如何取 max,我们注意到,假设我们要求 u,v 的最大值,只需要求出 u+2o−v,然后取出 o 这一位即可。
于是就做完了,剩下的就是程序实现的问题。
假设我们得到了 0000...01
(或者是 0000...00
)。
那么先左移若干位,1000...00
(或者是 0000...00
)。
然后相减,容易得到 1111...10
(或者是 0000...00
)。设其为 x。
只需要求 (u∧x)∨(v∧¬x)。
注意要从 2 的块开始合并,否则可能会溢出。
ARC144E GCD of Path Weights
首先扣出那些会被经过的点,剩下的点删除。
然后我们把点转成边,对于每个点建立入点和出点,然后边权为点权。
我们考虑把单向边看成双向边,反向的边权为负数。
我们对于每个点定义一个势能函数 wx,那么可以根据边求出每个点的 w,很显然,在 modans 意义下,我们要求 w1=wn。根据经典结论,一定存在这样一种定权方式。
而且对于每一个环,我们必须要求这个环的边权之和为 0。
直接连边 1,n,构建一个环,然后求出每一个环的总和的 gcd 即可。
注意到存在 −1 的点权,相当于这个图断成了很多个森林,直接对于每个森林都做即可,因为这些边无论选什么都是可以构造到解的。
类似的套路 CF2023C C+K+S
首先特判两个图连完之后不会构成一个新的大强连通分量的情况。
考虑对于每一个环的长度都是 k 的倍数,这启示我们一定存在 d1,d2 分别表示这两个图的定向情况。且最终图也满足这个情况。于是我们只需要对 d1 进行若干平移加修正就可以得到 d2,使用哈希判断即可。
ARC082E ConvexScore
注意读题。
观察到 2n−|S|,直接考虑组合意义,相当于这些点可以随意选,那么题目就转化为了选择一些点,问这些点会不会共线,不会共线就合法,直接枚举两个点,然后计算中间点的个数即可。
ARC141E Sliding Edge on Torus
这个题目考察了并查集的基本功,其实不难想到,是可以放在 NOIP 里面的。
我们看到这个问题的第一步肯定就是做差,把 (x,y) 看作 y−x 中的一个元素,于是有 n 个等价类,现在需要考虑如何合并两个等价类。
如果我们输入的两个位置不在同一个等价类,你就考虑这是一个对应关系,其中对应的关系是 (c−a)modn 这个东西。于是我们考虑使用并查集维护这个对应关系,具体的,设 wi 表示 i 这个点到这个并查集的根的对应关系,根为 x 的时候这个点为 (x+wi)modn。我们仔细思考一下,这个东西是可以合并的,如果你要合并的是两个结点 u,v,找到它们的根结点 x,y,把 y 合并到 x 上,设 u,v 的对应关系为 k,那么就是 k′+wv−wu=k,于是可以解出 k′,可以直接更新 wy 的值,然后并查集 find
的时候就可以每次把父亲的值累加上来然后再路径压缩。
对于答案,我们只需要维护一个答案数组,显然两个位置合并就是答案数组取 gcd,注意要与 n 也取 gcd。
如果我们输入的两个位置在一个等价类里,我们就考虑把答案与 k′ 也取 gcd,因为这相当于给 x 这个点连了一个自环。
10.23
easy game
直接 226 比较小。当然也可以用异或哈希。
Circle&Square
观察到每次一个点双直接尽量连成完全图即可。
未命名 1
注意到答案 ≤3×106,爆搜出所有合法位置,然后二维数点。
Sereja and Order
贪心好题。
首先注意到可以随机化,然后没了。下面讲一下正解。
我们先考虑如果存在 ai+bi 同时比 ∑a,∑b 都要大,那么显然答案是 ai+bi。
接下来答案的下界就是 max(∑a,∑b),下面给出取到这个下界的构造。
首先记 L=max(∑a,∑b),先新增一个限制 (L−∑a,L−∑b)。
考虑按 a+b 从大到小填,分别往左右加,填到一个位置,发现冲突了,此时我们需要调整。
记红色为填过的部分,绿色为当前这一段,蓝色为剩下的部分。
上面分别为 sa,a,ea,下面分别为 eb,b,sb。
注意到因为我们将 a+b 排序了,所以 b≤sa 和 a≤sb 至少满足一个,取出满足的那个,根据对称性,取出 b≤sa。
如果 sa+sb+a≥L,那么直接让下面的绿色和蓝色交换位置,是对的。
否则,交换上面的红色与绿色即可。由于此时有了条件 sa+sb+a+b≥L,所以这样是合法的。
于是做完了,实际实现的时候可以直接枚举红绿蓝的全排列,直接 check,这样子不用思考细节。
Largest Smallest Cyclic Shift
给出一个很厉害的做法:先分别看作 X,Y,Z 个长度为 1 的字符串。每次选择最小和最大的两个串,拼接,最后剩下的哪一个串就是答案。
考虑证明正确性,我们先想一下目前有三个串,那么一定是符合 acb
的。
考虑归纳证明,我们假设已经得到了目前的一个串:a1ak⋯a2,现在考虑怎么把 ak+1 弄进去。
显然 ak<ak+1,那么我们新的串就可以看作是 a1,ak⋯a2,ak+1,这三个部分,直接拼接就是 a1ak+1ak⋯a2。
主要是需要感受一下贪心的过程,每次我们之所以要选择一个最大的串接到后面是因为如果接别的串就会出问题,就不可能是 f(T),仔细想想为什么。
ARC073E Ball Coloring
我们注意到,答案一定形如 (mx−i)(j−mn) 或者 (mx−mn)(i−j)。
从小到大枚举 i 的数值,可以用 multiset
维护答案。
事实上,对于第一种情况,可以直接贪心选择小的进入 mn 那一边,反之进入 mx 那一边。
10.24
最后一场模拟赛,打得好唐。
后天要冷静思考,不要急,像今天的四道题目都不难。
youyou 的垃圾桶
直接暴力线段树二分即可做到 O(qlogn),注意到答案递减可以做到 O(q+nlogW)。
坑: 注意要开 long long
。
youyou 不喜欢夏天
注意到直接对于 0,1 或 1,0 看成贡献为 0 做,再直接对原问题不考虑 m 做,减去 2m,两者取 max 是答案。
youyou 的序列 II
特判若干情况,考虑一般来说,我们肯定是找到后手能操作的最左端点和最右端点,如果中间先手可以一步干掉,就合法,线段树二分维护。
坑: 注意要开 long long
。
youyou 的三进制数
注意到操作是对称的,于是建图一定为无向图,仔细思考可以发现,z 合法,当且仅当建出圆方树之后 z 到 x,y 的路径上的点是圆点,直接枚举圆点子树加统计答案即可。
坑: 一定要注意啊!圆方树建的时候 x 的儿子不能到 x,要到儿子 y(指的是 stack
)。
CSP 赛前提醒
注意三个点,策略、心态、细节。
一些注意事项:看一下之前犯过的错误,一定不要再犯!
连通图
首先有做法 1,直接线段树分治加可撤销并查集即可。
我们看做法 2,求出原图的一个生成树,得到一些树边和非树边,令第 i 个非树边的权值为 2i,令这条边的两个端点在树上的对应路径全部异或 2i。
定理:
不连通,当且仅当,存在询问边的子集异或权值等于 0。
证明考虑两步:
- 极小的割一定异或和为 0。
- 异或和为 0 的一定为一个割。
首先考虑证明极小的割一定异或和为 0。
证明:
极小割一定把原图划分成了 S,T 两个点集。
可以说明,对于一个环,我们取出 S 走到 T 的边,这样的边一共有偶数条,因为你考虑从一个起点出发,要回到这个点,就必须走偶数次这样跨越集合的边。
然后我们考虑证明异或和为 0 的一定为一个割。
证明:
异或和为 0 说明,每条没被割的非树边,都经过被割的树边偶数次,这个是显然的,因为这样子才能保证异或和为 0。
然后我们考虑把没被割的树边缩在一起,形成若干个大点,然后再使用被割的非树边相连,由于上面所述,则没被割的非树边所连的两个大点的深度奇偶性一定相同,由此,深度偶数的大点就一定不会与深度为奇数的大点相连,于是原图不连通。
该边即为割集。
由此,我们直接随机权值,然后跑线性基即可。
时间复杂度 O(qklogW)。
事实上,这就是 ix35 论文中所说的切边等价、割线性空间等东西,有时间了好好看一下。
AGC008D K-th K
每个数相当于有两个限制。
考虑每次填最近的有限制的数即可,你直接从前往后做一遍,从后往前做一遍即可。
时间复杂度 O(n2)。
本文作者:OptimisticForever
本文链接:https://www.cnblogs.com/OptimisticForever/p/18503633
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步