AGC做题记录

AGC做题记录

从比较远古的题开始做起吧。

个人觉得比较好玩的题:
AGC001D AGC001F AGC002E AGC003E AGE003F AGC004C AGC004F AGC005C AGC005E AGC005F AGC006C AGC006E AGC007C AGC007E AGC008E AGC008F

AGC001

C

经典题。

考虑直径中点,讨论长度奇偶性直接\(O(n^2)\)做就行。

提交记录

D

不是很难的构造题。

思考题目给出的条件,不难想到把等价关系转化为连边,那么序列合法等价于形成了一个连通块。

这时候考虑连通块的一些必要条件,就是边数大于等于\(n - 1\),可以推导出\(A\)中奇数不超过2个。这时需要大胆猜想这是有解的充要条件,直接构造答案。

我在做题时到这一步就没思路了,其实可以考虑一些比较弱的情况,每次只连出来一个点,也就是\(B\)刚好是\(A\)右移一位,不难发现这个构造是对的。考虑奇数怎么做,其实直接把奇数丢到首尾就行了因为这个时候两端不会连到另一个\(B\)的回文串内。

提交记录

E

典中典之组合意义题。

很容易把这个东西变成\((0,0)\rightarrow(a_i+b_i+a_j+b_j) \iff (-a_i,-b_i) \rightarrow (a_j,b_j)\)的方案数,那么dp算就行了。

提交记录

F

非常有意思的思维题。

第一步就把我难住了,这个交换的条件显然非常散乱,难以找寻到其中的性质。题解给出了一种巧妙的思维方式:考虑将排列\(P\)视为置换,这个置换的逆。假设这个逆置换为\(Q\),那么\(P\)字典序最小等价于\(Q\)字典序最小,而我们可以对\(Q\)进行的操作就是当相邻两个数之差的绝对值大于等于\(K\)时,可以交换它们。

这个转化是大胆的,但它毫无疑问极大地简化了问题。

这个时候不难想到直接对\(Q\)进行冒泡排序,因为不能交换的数的相对顺序确定,所以这个贪心排序是正确的。我们就得到了一个\(O(n^2)\)的做法

既然想到了冒泡排序,那么不妨试着优化,对于和“排序”有关的一类题目,都可以考虑进行归并。

容易发现,右区间的\(j\)优于左区间的\(i\)当且仅当左区间中\(i\)的后缀最小值不小于\(Q_j+K\)。这个后缀最小值可以直接维护。复杂度\(O(n\log n)\)

相较于线段树优化拓扑排序,我认为这种思路比较自然也比较优秀。

提交记录


AGC002

D

一眼整体二分题。

当然也可以Kruskal重构树,不过我比较想练整体二分,就写了这题,二分后判断\(x,y\)所在连通块的并的大小和\(z\)的关系就行了。

但我写着题的时候被坑了许多发。首先是要把加边也二分进去,否则会变成\(O(n^2)\),然后注意当前二分答案区间对应询问区间为空的时候不能直接return,这个时候要加边。

提交记录

E

典中典之Ferrers图上走路题。

经典的Ferrers图的转化,朴素的想法是在上面dp,简单思考一下后发现可以快速算,那么就做完了。

提交记录

F

不知道怎么评价dp题。

发现白球很难处理,考虑在状态中体现合法性。设\(f_{i,j}\)表示已经选了\(i\)个白球,放完了\(j\)种其它颜色。

直接转移即可。

提交记录


AGC003

C

简单题。

这种套路见得多了,不多说。

提交记录

D

连续WA9发的神秘题。

思路不难,首先把每个数除以最大的完全立方因子,那么构成许多等价类。发现等价类一一对应,每一对等价类取较大那个加入答案即可。

一个晚上的战斗后借助std终于对了。

提交记录

E

有意思的好题。

首先一部分操作是没用的,可以用单调栈处理掉,那么剩下的\(q\)就是单调增的,以下设初始的\(q_1=n\)

不妨考虑若有\(\forall i, q_{i - 1} | q_i\),那么每次操作都相当于让之前的序列重复\(\frac{q_i}{q_{i-1}}\)次,把这个重复次数设为\(f_i\),这个可以倒推,一直累加到\(f_1\),答案就全是\(f_1\)

顺着这个思路想下去,考虑倒推每个时刻序列的重复次数以算出\(f_1\),不难发现剩下的\(q_i \bmod q_{i-1}\)是难以处理的,这时候这题最妙的地方就是递归处理这个剩下来的部分。因为我们的\(q_i\)单调增,所以前面扩展出来的序列是固定的,那么这个剩余的部分就作用在前面的一个\(q_i\)上,这个可以通过二分找到。这样就得到了一个子问题,可以递归求解。

最后,在\(f_1\)上剩余的部分不可再分,但是\(q_1\)\(O(n)\)的,那么维护一个差分直接做就行。

由于每次取模二分,复杂度就是\(O(n \log ^ 2 n)\)的。

提交记录

F

看不懂题。

首先肯定要考虑一些特殊情况,\(k\)级分形中包含的所有单位分形可能都联通,也可能都不连通,直接特判掉。

那么考虑剩下的情况就行了,不妨设左右联通,上下不连通。

从比较简单的情形入手,\(k=2\)

不难想到,答案是黑点数量减去多算的部分。假设黑点数量为\(c\),接下来考虑多算的部分怎么做。

\(k=2\)时,多算的部分就是单位矩阵中左右相邻的黑点对数。

下面推广到\(k\)较大的情况,考虑递推:设\(f_i\)\(i\)级分形的答案,\(s_i\)为两个\(i\)级分形拼在一起多算的部分。

画个图感受一下,设\(c\)为黑点数量,\(p\)为单位分形中相邻黑点对数,\(r\)为将两个单位分形拼在一起,在交界处出现的相邻黑点对数,显然有

\[f_i = c f_{i - 1} - p s_{i - 1}\\ s_i = r s_{i - 1} \]

那么直接矩阵加速就行了。

提交记录


AGC004

C

诈骗题。

搞了一个晚上,结果一看题解大为震撼。

注意到边界为空,乱弄即可,详见代码。

提交记录

D

简单题。

显然1只能连向1,然后在树上贪心选即可。

提交记录

E

简单恶心题。

显然转化成起点在移动,那么dp就行,有点细节,不过对称,也不难写。

CSP-S2022告诉我们,注意到空间不能直接开\(100^4\),应该开short

提交记录

F

基环树神仙题。

首先考虑树。一开始的思路是DP,思考一段时间后发现操作没有什么特征,且顺序难以确定,只能放弃。

有一个非常巧妙的构造,由于树是二分图,可以对其进行黑白染色,那么不难发现每次操作相当于交换相邻两个颜色不同结点的颜色。颜色全部反转为最终状态。那么很容易可以得到一个必要条件:黑点数等于白点数,事实上这就是充要条件。

考虑每条边至少走多少次,设子树内黑白点数量之差为\(a_i\),显然为\(|a_i|\)。在此基础上考虑构造方案,只要先做子树就行了。那么答案就是\(\sum |a_i|\)

对于有环出现的情况,我们的思路是先沿用二分图染色的方法,然后再单独考虑不合法的边\((u,v)\)对答案的影响。显然,应分奇环偶环两种情况讨论。

如果是偶环,那么假设这条边对上方\(a\)的影响为\(x\),不难发现环内点的贡献变为\(\sum|a_i - x| + \sum|a_j + x|\),我们希望令这个,这就变成了一个小学生数学题。取\(x\)为中位数即可。

如果是奇环,那么这条边会改变这棵基环树的黑白点的数量,为了满足有解的充要条件,这条边的操作情况是一定的,那么直接算影响然后把这条边删了就行。

提交记录


AGC005

B

蓝题。

提交记录

C

结论题。

不难想到把最长的链拉出来,那么剩下点的只要绑在这条链上就行了,限制是比较显然的。

提交记录

D

一般题。

直接二项式反演,设钦定\(i\)个匹配,剩下随便选的方案为\(g_{i}\),那么答案就是\(\sum_k (-1)^k g_k\),考虑怎么求\(g_k\),就是算\(k\)个匹配的方案数,把边建出来直接dp就行。

提交记录

E

神仙博弈题。

假设\(u\)在A树上深度为\(depa_u\),在B树上深度为\(depb_u\)

发现这个树乱连,很难找到其中性质,考虑一个简单的情形:若在一个点上A走一次可以让B为之走许多次,那么只要A成功走到这样的点就赢了。具体来说,若A树上边\((u,v)\)满足在B树上两点距离不小于\(3\),这两个点就满足条件。

这样,我们简化了问题,先假定A走的点都不满足上述条件,那么这时有什么性质呢?

可以发现,这个时候A没有办法操作B了,因为A一旦走到B走过的地方,B定然可以一步抓住A,所以A只会在B树中\(u\)的子树里走。游戏变成了简单的B追赶A。

那么B到达点\(u\)的时间就是\(depb_u\),A能走到的点都满足\(depa_u < depb_u\),也就是说A比B先到点\(u\)。直接在树上求答案即可。

提交记录

F

好题。

一开始列式子挺难想的,我们想要算对于每个\(f_i\),每个点\(u\)的贡献是多少,就是\(u\)在多少个满足条件的集合内。这个让人摸不着头脑,不妨容斥一下,算\(u\)不在多少个集合内,那么这些集合一定满足集合内所有点都在以\(u\)为根的同一棵子树内,所以答案可以写成

\[\begin{aligned} f_i &= \sum_u (\binom{n}{i} - \sum_{v \in \operatorname{son}_u} \binom{sz_v}{i})\\ &= n \times \binom{n}{i} - \sum_u \sum_{v \in \operatorname{son}_u} \binom{sz_v}{i} \end{aligned} \]

显然,右边那一部分的\(sz_v\)是很少的,那么可以先把每一中\(sz\)有多少个用一个dfs统计出来,假设系数为\(\lambda_i\),那么要求的就是

\[\sum_{k=i}^{n} \lambda_k \binom{k}{i} = \frac{1}{i!}\sum_{k=i}^{n} \frac{\lambda_k k!}{(k-i)!} \]

那么这个式子可以直接用NTT卷起来,复杂度\(O(n \log n)\)

提交记录


AGC006

B

简单构造题。

不难发现两个相邻且相同的数字会保留,那么在中间放\((1,x,x+1,2)\)然后调整一下就行。

提交记录

C

好题。

由期望线性性可得操作一次会发生的变化为:\(E_i' = \frac{(2E_{i - 1} - E_i) + (2E_{i + 1} - E_i)}{2} = E_{i - 1} + E_{i + 1} - E_i\)

考虑如何快速维护这样的操作。发现这个操作似曾相识,在之前的模拟赛中做过,他等价于交换相邻两个差分。

所以我们可以先把差分求出来,然后算出每个差分最后到达了哪里。怎么算呢?可以发现一次set相当于对之前的位置乘上了一个置换,而置换满足结合律,所以可以直接快速幂,\(O(n \log k)\)。当然,也可以把大置换拆成若干个单位置换,然后直接做,\(O(n)\)

提交记录

D

一般题。

考虑沿用B的思路,先二分一个答案,把所有数转变为01,不难发现若有相邻两个数一样,那么答案就是对应的0/1,而若同时出现多组相邻相同,离\(n\)最近的会被取到。注意到不可能出现两组相邻相同且和\(n\)等距,那么直接做就行。

提交记录

E

好题。

首先考虑简化问题,先判掉一些不合法条件,将所有数字按照除以\(3\)的商分组,那么每一列可以用一个数对表示为\((x,y)\),其中\(x\)为这一列的数字的组的编号,\(y\)表示这三个数是否升序。

那么题目中的操作就等价于交换\(x_i,x_{i+2}\)同时将\(y_i,y_{i+1},y_{i+2}\)同时取反后翻转。这个操作肯定和奇偶性有关,所以分组做。先考虑\(y\)的限制,发现可以将同组的两个\(y\)同时取反,所以记录降序的奇偶性。再考虑\(x\)的限制,不难发现奇偶性就是逆序对奇偶性,而奇数组的\(x\)交换后会影响偶数组的\(y\)的奇偶性,反之亦然,那么判断奇数组\(x\)的逆序对奇偶性和偶数组\(y\)降序数量奇偶性,反过来再做一次就行。

提交记录

F

一般题。

题目的表述有点让人摸不着头脑。建图转化,若\(x\)连向\(y\)\(y\)连向\(z\),则\(z\)连向\(x\)。那么有一个经典办法就是将原图三染色,相邻的点颜色不同,然后答案是容易计算的。

提交记录


AGC007

B

没做出来题。

先考虑使\(a_i+b_i\)为定值,发现可以给\(A,B\)都乘上一个很大的权,然后调整。

提交记录

C

神仙好难期望题。

一开始的想法肯定是直接算,然而想了一会之后发现推球的顺序会影响答案,然后发现没法直接做了。

注意到题目中给了一个等差数列一定是有用的,考虑处理等差数列的经典办法,把这条直线反过来,答案不变,此时由期望线性性正反直线答案相加恰为原本答案的两倍,但不同的是这时距离为常数,因此可以令\(d=1,x=0\),求出来的答案乘\(\frac{2d_1 + x(2n - 1)}{2}\)就是最终答案。

考虑把每条线段的贡献拆开算,那么一定有一些线段被合并了,不好算,但是我们可以模拟推球的过程,然后把当前每条线段的期望长度算出来。分别考虑有没有合并线段,假设原长为\(1\),那么期望长度为

\[\frac{2n-2}{2n} \cdot \frac{2n}{2n-2} + \frac{2}{2n} = \frac{n+1}{n} \]

直接模拟即可。

提交记录

D

神奇dp题。

首先每一段肯定只会走\(1\)次或\(3\)次,先把答案加上一个\(E\),剩下只需求出重复走的路程的最小值。

注意到点都在\((0,E)\)上,考虑dp,比较简单,不写。

提交记录

E

有启发性的好题。

先来个二分。考虑使用动态规划判合法性。设\(f_{u,a,b}\)表示进入子树\(u\)\(a\)的代价,出来有\(b\)的代价,是否合法,转移是显然的。

这样做的复杂度是\(O(n^3 \log V)\),显然需要优化。

对于这一类问题,可以思考去掉一些不必要的状态,显然,在本题中,若存在\(f_{u,a,b}\)\(f_{u,a',b'}\),且满足\(a < a', b < b'\),那么\(f_{u,a',b'}\)就是无用的。

这样随着\(a\)单调增,\(b\)单调减,考虑利用单调性快速转移,利用双指针可以做到线性。

这样一次check就与状态数级别的,考虑算状态数,合并左右子树带来的新的状态数为左右子树状态数的最小值\(\times 2\),类似启发式合并,总状态数为\(O(n \log n)\)

综上,总复杂度为\(O(n \log n \log V)\)

提交记录

F

一般题。

这个贪心比较简单,简单来说就是每次能往前走就往前走,发现这个过程类似许多条折线,可以考虑维护折点的横坐标。可以归纳证明一个性质:折点的纵坐标一定是\(1,2,3....\),那么用一个队列维护就行了。

提交记录


AGC008

B

结论题。

最开始的想法是dp,然而第二个样例就做不了了。。不难发现操作顺序非常棘手,于是放弃dp这条路,寻找操作的性质。

由于最后一次操作是没有办法被覆盖的,所以我们考虑枚举最后一次操作,那么剩下的两边的点都可以通过相邻的黑白操作任意选,所以答案就是一个前缀\(\max\)和一个后缀\(\max\)和中间一段长为\(k\)的区间的答案相加。

提交记录

C

垃圾题。

随便做,千万别做。

提交记录

D

垃圾题。

把颜色分为三类:必须填、必须不填、随便填。然后模拟就行了。

提交记录

E

神题。

题解 提交记录

F

启发性神题。

这题主要难题是解决算重的情况,题解给出一种经典思路。考虑设\(S(u,d)\)表示选则点\(u\),半径为\(d\),染色出的点集。首先忽略整棵树都被染色的情况,我们在\(d\)最小的那个位置统计答案。这样为什么是对的?因为两个不同的点不可能通过相同的\(d\)得到相同的点集。这种取最小值的思路是可以借鉴的。

先考虑所有点都可以作为中心的情况,显然对于一个点合法的\(d\)是一个前缀,考虑算最大值。首先不能把整棵树染色,其次不能有其他点用更小的\(d\)得到相同点集。可以直接考虑相邻点。若 \(S(u,d - 1)=S(v,d)\),那么 \(S(u,d - 1)\) 一定把 \(v\) 的除去 \(u\) 的所有子树都染色了。设 \(f_k(u)\) 表示以\(u\)为根,子树深度第 \(k\) 大,也就是\(d - 1 \ge f_2(u) + 1\),所以 \(d\) 的上界就是 \(\min(f_1(u), f_2(u) + 2) - 1\)

现在有一些点不能作为中心了,由于我们上面的计数方法,有一些方案少算了。那我们就要算 \(u\) 有多少种方案可以被其它点染色得到。注意到这次 \(d\) 是一个后缀,可以考虑求出其下界。还是反过来思考,如果一个可以作为中心的点可以得到 \(S(u,d)\),那么显然这个关键点所在子树一定被全部染色了,我们考虑这个点为 \(v\) , \(S(v, d')\) 满足了条件,那么 \(d' > d\)\(v\) 所在子树中每一个点都可以被 \(v\) 到达,所以 \(u\) 也一定可以到达。所以求出每个点有关键儿子的子树的最大深度最小值就是下界。

上述所有需要求的东西都可以通过换根DP实现,复杂度 \(O(n)\)

提交记录

posted @ 2022-11-03 16:09  DCH233  阅读(70)  评论(0编辑  收藏  举报