2024.11.1 近期练习
板刷 ARC,再不刷就退役了。
ARC185A mod M Game 2
猜结论题,两个人牌的总和是 \(n\times (n+1)\)。若 \(n\times (n+1)\bmod m=0\) 或 \(> n\) 先手获胜。
显然手牌还有大于 \(1\) 张的时候不可能失败。
和取模 \(m\) 为 \(0\) 那么后手一定最后一张失败;若取模 \(\le n\) 则后手一直拿着这张牌先手转化为上述情况。
剩下的情况所有牌都出完,先手胜。
ARC185B +1 and -1
假设已知目标序列 \(g\),将大限制转化为小限制,对于每个前缀都满足 \(\sum a\le \sum g\) 即可。
贪心地考虑 \(g\),显然是所有数尽量相同,前面一段数,后面是该数 \(+1\) 的一段数。
ARC185E Adjacent GCD
很明显地拆贡献。同时对于每个前缀算答案启示我们增量法求答案。
加入 \(i\) 的时候,对于每个 \(j\) 有 \(\gcd(a_i,a_j)\times 2^{j-1}\) 的贡献,现在考虑 \(\gcd\) 的性质。
考虑把 \(j\) 的贡献全部存进其约数的桶里,查询的时候,\(\gcd = d\) 的贡献减去所有 \(d\) 的倍数贡献即可。
然而这么做复杂度需要调和级数,无法通过。考虑对于每个 \(d\),改变一下其贡献的系数。
我们原本求的是 \(\sum d\times f_d\),其中 \(f_d=g_d-\sum_{d|y}f_y\),\(g_d\) 表示桶里存的贡献。
考虑令 \(d\) 的系数容斥一下,因为 \(d\) 会被其因数都算一遍,所以从小到大每个减去其因数的贡献即可。
则 \(c_d=d-\sum_{y|d}c_y\),而这几把玩意其实就是 \(\varphi(d)\),因为 \(d=\sum_{y|d}\varphi(y)\),这大抵就是欧拉反演把。
ARC184A Appraiser
很几把唐氏这个题,考虑每 \(11\) 个分一组,每个组只需要比较 \(10\) 次。
每个组至少有一个真币;并且一定存在全部都是真币的组,这个可以求出来。
那么我们已知一枚真币的情况下再去对未确定的组判断即可。
ARC184B 123 Set
注意到,所有数可以按照去掉 \(2,3\) 的因数后分组。每组都是独立的。即每个数写成 \(k2^i3^j\)。
对于每组都是一个有向图,分为若干层,每层的每个点向下一层的该位置和下一个位置连边。
相当于覆盖所有点,这玩意儿可以状压 dp,只需要支持超集 \(\min\) 即可。
然后注意到有若干组的图都是相同的,这个用一下整除分块套外面即可。
ARC184D Erase Balls 2D
考虑最后点的形式,显然为若干个矩形从左上角到右下角连起来。
所以直接做一个 dp 即可。但是有一个问题就是会算重。
我们需要钦定一个矩形里面的点不能被两个首尾相连的矩形全部包括即可。
也就是相当于构造双射,使得每种点的集合映出出来的矩形集合是唯一的。
ARC183B Near Assignment
盲猜需要分讨 \(k\) 是否大于 \(1\);\(k=1\) 的情况只需判断 \(b\) 每个连续段的元素构成的序列是否是 \(A\) 子序列。
\(k>1\) 的,考虑 \(1,3,2,1\) 为何不能变为 \(1,2,3,1\),当 \(k=2\) 的时候。
我们需要保证 \(A\) 每次操作后都包含 \(B\) 的所有元素,所以相当于只有一个空位。
而最后两个 \(1\) 的距离 \(>k\),导致我们最后一定会使某个元素消失,所以就不合法。
所以充要条件是若存在 \(b_i=b_j\),且 \(|i-j|\le k,i\neq j\) 的话就合法。
ARC183C Not Argmax
简单区间 dp,每次取出最大值之后划分子任务。
ARC183D Keep Perfectly Matched
最大化 \(\sum dep_u-\sum dep_{lca({u,v})}\),我们要定一个根。
贪心地,取重心为根,既使得 \(\sum dep_u\) 最大化,且明显 \(lca(u,v)\) 都可以取到根节点。
钦定匹配边为 \(1\),非匹配边为 \(0\),不难发现,每次选一个路径出来,必须选 01 交替的,并使 01 反转。
对于根的每个儿子是独立的,只需要 dfs 一遍即可求出第几次删第几个点。
考虑到一个点只有一个匹配边出边,所以堆维护所有非匹配边儿子,每次贪心地取出大小最大的子树。
ARC183E Ascendant Descendant
考虑倍增处理区间 lca,然后可以处理出一个 \(a_i\) 可以移动的区间。
然后如果取出所有区间直接做,是一个染色模型,发现是做不了的,需要找性质。考虑区间的性质。
注意到,区间是要么包含要么分离的。事实上区间除了这个性质没有别的性质。
所以这就是一个区间树,考虑从深度深的往深度浅的填。
这个染色模型可以见我的一篇论文。——关于一类染色计数问题的研究。
有一个严重的问题就是 \(a_i\) 能移动的区间不一定对,考虑如果有一个动不了的你就不能换过去。
也就是说一个区间如果其最后没有多出来的位置就不能跨越。
ARC182C Sum of Number of Divisors of Product
典题但不会。考虑只有 \(6\) 个质数,状态存每种子集的 \(c_i\) 的积 \(g_s=\prod_{i\in s} c_i\)。
那么转移就容易了,设加入 \(i\) 这个数,其对应每个质数的次数向量是 \(\{a_i\}\)。
那么 \(g_s\gets \sum_{t}g_{s-t}\times (\prod_{i\in t}a_i)\)。相当于把乘积式展开。最后矩阵快速幂优化即可。
ARC182D Increment Decrement Again
逆天题。以下的内容大抵是抄袭题解。判掉 \(m=2\)。接下来有个奇妙的转化:
看成 \(A\) 不对 \(m\) 取模,要求变为 \(\forall i<n,|a_i-a_{i+1}|<m\) 且满足 $ a_i\not= a_{i+1}$。
然后发现 \(a\) 的大小关系是不会变的,所以如果固定了 \(a'_1\),则后面的都是固定的。可以先令 \(a'_1=b_1\),根据大小关系求出任意一组合法的 \(a'\),接下来问题变为最小化 \(\sum_{i=1}^n|a_i-a'_i-km|\),可以二分类似找中位数的方法解决。复杂度 \(\mathcal O(n\log n\log V)\)。
ARC181B Annoying String Problem
结论题,首先可以解方程得到 \(|T|\),然后判断 \(\gcd(|S|,|T|)\) 是否为 \(S\) 循环节即可。
ARC181C Row and Column Order
考虑将令 \(p=\{1,2,3,..n\}\),\(q\) 随之变换。令 \(p\) 为行,\(q\) 为列。
考虑 \(q=\{n,...3,2,1\}\),把 \((1,1)\sim (n,n)\) 对角线以上的全部填满即满足条件。
不难发现此后只要交换一下列使其为 \(q\) 即可满足条件。
ARC181D Prefix Bubble Sort
考虑一次冒泡排序,从第一个位置开始,其会被冒泡到第一个比他大的位置,这个位置接着冒泡。
那么逆序对数发生的变化就是向前移动一个位置的位置的数量。
所以考虑拆贡献到每个位置向前移动多少。
如果当前冒泡的前缀包括了 \(i\),那么若其前面还有比他大的数就一定会移动一次,考虑差分一下即可。
ARC180B Improve Inversions
首先答案上限是 \(\sum_{i=1}^n\sum_{j=i+k}^{n}[a_i>a_j]\)。我们盲猜这个上限是可以取到的。
考虑从小到大枚举 \(i\),每次取出所有比它小的能和它交换的数,排序后从大到小交换相邻的两个。
这么做是对的,第 \(i\) 次交换不会影响到更大的数,所以没有后效性。
排序后从大到小交换相邻的两个也是可以做到把所有能交换的都交换,即能顶到答案的上限。
ARC180C Subsequence and Prefix Sum
简单 dp。
ARC180D Division into 3
三种情况对应最大值所在的是第几个区间。
如果是中间那个区间,那么贪心地,左右两个区间肯定大小为 \(1\)。这个显然简单处理。
如果是边上那个区间,那么贪心地,中间那个区间大小肯定为 \(1\)。
即求 \(\max_{i\in[p,r-1]}a_i+rmq(i+1,r)\),其中 \(p\) 是第一个取到最大值的位置。
上述这个考虑单调栈+扫描线处理。
ARC179C Beware of Overflow
考虑归并排序,然后每次合并最大和最小的两个,然后合并出来的和在二分其位置插回去。
ARC179D Portable Gate
很明显的树形 dp+换根。状态有两种,\(f_{u,0/1}\) 表示遍历 \(u\) 子树是否需要回到 \(u\) 节点的答案。
设 \(t_x\) 表示直接遍历一遍子树并不回到根节点的代价,明显 \(t_x=2(siz_x-1)-\max_i dis_{x,i}\)。
设 \(g_{v,0/1}\) 表示 \(v\) 子树的贡献,那么 \(g_{v,1}=\min(f_{v,1}+2,t_v+1)\),\(g_{v,0}=\min(f_{v,0}+1,t_v+1)\)。
关于 \(\min\) 里的含义,前者是把门带进 \(v\) 子树,后者是把门留在 \(u\)。
那么,\(f_{u,1}=\sum g_{v,1}\),\(f_{u,0}=f_{u,1}-\max(g_{v,1}-g_{v,0})\)。
最后直接考虑换根 dp 即可。换根有一个无需脑子的写法就是每个点维护 set 存当前所有儿子。
ARC179E Rectangle Concatenation
考虑 \(O(n^2)\),枚举左端点,考虑 dp。
不妨设 \(f_{r,0/1}\) 表示当前到 \([l,r]\) 区间,\(r\) 这个矩形贡献的边是 \(h\) 还是 \(w\),当前状态是否合法。
那么 \(f_{r,0}=[h_{r-1}=h_r]f_{r-1,0}\vee [\dfrac{s_{l,r-1}}{w_{r-1}}=h_r]f_{r-1,1}\),
\(f_{r,1}=[w_{r-1}=w_r]f_{r-1,1}\vee [\dfrac{s_{l,r-1}}{h_{r-1}}=w_r]f_{r-1,0}\)。
所以我们对于 \(f_{r,0/1}\),维护合法的左端点。
关于前者的转移直接计算,后者的转移需要用哈希表存一下对应 \(s\) 的位置。
ARC178C Sum of Abs 2
巨 jb 简单,显然背包,注意到物品的种数是根号级别,于是做完了。
ARC178D Delete Range Mex
观察到我们删数一定是从大往小删,删了某个数之后会导致比他小的数都只能放一边。
然后划分子任务做区间 dp 即可,前缀和优化。
ARC177D Earthquakes
不难发现可以把电线杆划分为若干个区间,他们之间互不影响。答案是所有这样的区间概率只积。
而在一个区间里的所有电线杆如果出现地震,会把左边或右边的所有电线杆都带倒。
考虑处理一个区间的答案。考虑若 \(i\) 发生了地震后全部都倒塌的概率。
若当前只剩 \(i\) 一个,任意方向倒塌都可以;否则 \(i\) 必须是中间区间的某个端点才行,概率 \(1/2\)。
因为 \(i\) 是最后剩下的,所以 \(i\) 左边的必须往左倒,\(i\) 右边的必须往右倒。
相当于解决前缀最小值的个数,用单调栈解决。
在这个题我的错误是执着于设区间为状态;应该考虑直接答案的计算。
ARC176C Max Permutation
注意到如果存在两个限制共一个端点,即 \(\max(A,B)=x,\max(B,C)=y\)。
若 \(x>y\) 那么 \(A=x\),然后 \(\max(A,B)=x\) 这个限制可以删掉。
若 \(x=y\) 那么 \(B=x=y\),然后只需要满足 \(A<x,C<x\)。
考虑从小到大枚举边并删边,最后剩下的就是若干条独立的边和若干个点的限制。
判掉边的限制和点重合的情况,最后从小到大算贡献乘起来即可。
ARC176D Swap Permutation
考虑拆贡献,绝对值看做距离,距离的话枚举其间所有值,若 \(p_i,p_{i+1}\) 分居值两侧就有 \(1\) 的贡献。
那么现在所有数都只有 \(0/1\) 之分。那么继续拆贡献到每对相邻的数。
每对相邻的形态只有三种:00,11,01/10。考虑跑 \(3\times 3\) 的矩阵快速幂计算答案。
ARC175D LIS on Tree 2
考虑先构造出每个点的 LIS 长度使得加起来为 \(k\)。
注意到 LIS 长度差分后的值只有 \(01\),考虑把差分为 \(1\) 的位置拿出来,其贡献是子树大小。
考虑把所有子树大小从大到小排序,贪心构造出一种方案。
考虑给每个点赋值,LIS 为 \(k\) 那么可以构造 \(k\) 个下降序列拼起来,且这 \(k\) 个序列的值是递增的。
那么对于 LIS 增加 \(1\) 的点将其赋为其父亲的值 \(+siz_u\),不增加的点赋给最大的能赋的不超过父亲的值。
ARC174C Catastrophic Roulette
两个人的操作是一样的,所以我们只用区分先后手。
考虑 dp,设 \(f_{i},g_i\) 表示当前已选 \(i\) 张牌,先手/后手期望代价。
\(f_i=\frac{n-i}{n}g_{i+1}+\frac{i}{n}(g_i+1)\),\(g_i=\frac{n-i}{n}f_{i+1}+\frac{i}{n}f_i\)。
递推,对于 \(f_i,g_i\) 相当于解方程。
ARC174E Existence Counting
考虑枚举第一个不满足最高位限制的位置,设当前未填的有 \(k\) 个数,有 \(p\) 个位置未填。
第一个不满足最高位限制的数是什么我们也需要枚举。设满足这个条件的数的集合大小为 \(m\)。
这 \(k\) 个数每个数的出现次数都是 \(m\cdot p\cdot A_{k-1}^{p-1}\)。已填的个数 \(n-k\) 个数的出现次数是 \(m\cdot A_k^p\)。
在这个集合里的数的出现次数是 \((m-1)\cdot p\cdot A_{k-1}^{p-1}+A_{k}^p\),对应未填/已填。
所以我们需要维护三个集合:已填的数;未填的数可以填进当前位的;未填的数不可填进当前位的。
显然,第二个集合是未填的数集合一段前缀;第三个集合是一段后缀,简单维护即可。
考虑树状数组维护差分信息。
ARC173C Not Median
套路地将大于 \(x\) 的数设为 \(1\),小于 \(x\) 的数设为 \(-1\),\(x\) 设为 \(0\),找最小的区间满足和为 \(2\) 或者 \(-2\)。
观察到 \(x\) 为中位数的区间都是 \(-1,1,-1,1,0,-1,1,-1,1\) 的形式。
那么,如果有相邻的 \(1\) 或 \(-1\),就一定能找到答案。注意特判边上两个的答案。
所以枚举 \(x\),顺便 set 维护 \(1,-1\) 相邻的位置即可。
ARC173D Bracket Walk
逆天。将左括号视为 \(1\),右括号为 \(-1\)。一个环路若和为 \(0\) 就一定能找到一个起点使其合法。
由于是一张强联通图,所以一定存在一个环包括所有点,然后相当于插入环,一个环可以绕若干圈。
如果图的环都是和为 \(0\),那么显然合法;如果存在正环和负环,那么显然可以平衡。
所以当前仅当正环或负环独立存在的时候不合法。考虑 spfa 判负环。