AtCoder 比赛历程

AtCoder 比赛历程

ABC 337-G

题目大意:给定一棵树,对于树上的每个点\(u\),定义 \(f[u]\) 表示满足点 \(w\) 在点 \(u\) 到点 \(v\) 的路径中,且 \(w>v\) 的点对 \((w,v)\) 的数量。 \(u\) 可以等于 \(w\)

解法:比赛时先考虑将一个点钦定为 \(w\) 时,该点对其他点的贡献。发现对于一个点,它可以通过它的一个子树内比它要小的点,贡献到除这棵子树以外的所有点(子树包含“向上”的)。于是思考如何快速计算以某个点为根的子树中,有多少个点的编号小于某个点。比赛时想到用个可持久化线段树……但当然打不出来,赛后经过 lym 的启发,发现只用普通的树状数组就行了。我们只需要将树上的点从小到大加入,同时贡献。这样就避免了会统计到不该统计的点的问题。

ABC 338-D

题目大意:给定一个长度为 \(n\) 的环,以及一个长度为 \(m\) 的序列,现在需要在这个环上断掉一条边,问在最佳情况下,顺次走完(可以重复)序列中每一个点所需经过的最小边数。

解法:比赛中的做法不知道为什么一直炸,炸的还挺离谱。考虑枚举断掉的边然后计算贡献。对于序列中相邻的两个数,设小的为 \(a\) ,大的为 \(b\) 。若断掉的边在 \(a\)\(b\) 的路径上,则贡献为 \(n-(b-a)\) ;反之则在 \(b\)\(a\) 的路径上的贡献加上 \(b-a\) (表示选另外的一条路)。然后用差分做就可以了。

ABC 338-F

题目大意:给定一张 \(n\) 个点、 \(m\) 条边的有向图(n<=20),每条有向边有一个权值 \(w[i]\) (\(-10^{6}\le w[i]\le 10^{6}\)),问从任意一个点出发,经过所有点的最小的边权和,点和边可以重复经过。

解法:考虑最终的答案是由若干条从点 \(x\) 到点 \(y\) 的最短路径构成的。所以先处理出每两个点直接的最短路,然后进行转移。

注意事项:在有负边权的图中判断无解,需要考虑有可能一个点沿着一些负边移动的情况

不要乱用short

ARC 148-D

这题显然不是在比赛的时候做的。WC的时候题目选讲中的题目,但是是很好的博弈论。

题目大意:给定 \(2n\) 个数,\(A\)\(B\) 轮流取数,取完后计算 \(A\) 取的数的和与 \(B\) 取的数的和在\(\mod m\) 意义下是否相等,如果不相等,则 \(A\) 获胜;否则 \(B\) 获胜。

解法:考虑最后只剩两个数的情况,发现只有最后的两个数\(a\)\(b\) 满足\(a-b=b-a(\mod m)\) 时,\(A\) 无论取哪个数的结果都是一样的。所以我们可以把满足 \(a=b\)\(a=b+m/2(\mod m)\) 两两配对。接着我们发现,对于 \(a=b+m/2(\mod m)\) 的数对,需要满足其有偶数个,\(B\) 才能获胜。所以我们总结一下 \(B\) 获胜的条件:需要有若干个满足 \(a=b\) 的数对和偶数个满足 \(a=b+m/2(\mod m)\) 的数对。

ABC 341-G

题目大意:给定一个长为 \(n\) 的序列 \(a\) ,然后对于每个位置 \(i\) ,求出以 \(i\) 为开头的前缀的平均值的最大值。

解法:相当巧妙。设 \(sum[i]\) 表示 \(a[1…i]\) 的总和,接着我们发现,求平均值的式子 \((a[j]-a[i-1])/(j-(i-1))\) 和求两点之间斜率的式子一样!所以我们将 \(a\) 上的每一个位置都变成一个点 \((i,sum[i])\) ,再加上一个 \((0,0)\) 。之后我们从后往前加入点,然后使用单调栈维护凸包,第一个没被踢出来的点即为答案的右端点。

ABC 361

好久没写了,到了暑假才开始写。而且这篇还是拖了好久的

赛时:B题一直想着 \(O(1)\) 判断,但是有很多情况要处理,一直在考虑如何考虑所有情况,导致WA了好多发。最后才想到可以暴力判断。D题的细节一直没处理好,不够仔细,也是罚了好多发,还影响了做E、F的时间。下一次在写题时要认真思考后再写,不要急。

ABC 361-G

题意:在第一象限(包含坐标轴)中,有 \(n(n<=2*10^5)\) 个石头,问所有满足 \(x>=0,y>=0\) 的点中,有多少个不可以通过上下左右移动走到 \((-1,-1)\) 的。

解法:既然是连通性问题,我们考虑用并查集。但是点数太多,所以我们使用缩点,将每一行中,从一块石头到下一块石头中间的所有点缩成一个大点。 我们通过在两边放一排石头,使得可以走到 \((-1,-1)\) 的点放到一个并查集里,注意要在两边多留一条空隙。最后将每一行的大点依次合并,用总数减掉 \((-1,-1)\) 所在的并查集的大小和石头数量就是答案

ABC 362

原题大赛,打的还不错,上了 \(90+pts\)

ABC 362-F

题意:给定一棵树,需要你输出 \(\left \lfloor n/2\right \rfloor\) 个点对,使得这些点对的距离之和最大。

解法:考场上想到重心,如果说一棵子树和另一棵子树之间的点能够刚刚好配对,那么无论配对方法是什么,对答案的贡献是不变的,而且是最优的。然后我就开始尝试用各种方法合并子树,最后都WA掉了。发现我们只要把每个子树内的所有点放入一个数组内,如果 \(n\) 为偶数,那么将重心也放进去,最后将下标为 \(x\)\(\left \lfloor x/2\right \rfloor\) 的两个点合并就好了。因为重心的子树大小不会超过 \(\left \lfloor n/2\right \rfloor\) ,所以这样做是正确的。

ABC 364

在打 D 题的二分时有点犹豫,还需加强二分的能力。E 题的DP没有想到这样的一个套路,还要多练习。

ABC 364-E

题意:给定 \(n(n\le 80)\) 道菜,每道菜有两个属性 \(x\)\(y(x,y\le 10000)\) ,可以按照任意顺序吃,但是如果吃掉的菜的 \(\sum x>X\)\(\sum y>Y\) ,则不能继续吃了,问最多吃多少道菜?

解法:很容易想到的一个DP是:设 \(f_{i,s1,s2}\) 表示当前吃到第 \(i\) 道菜,吃完的菜的属性 \(x\) 的总和为 \(s1\) ,属性 \(y\) 的总和为 \(s2\) ,值为最多吃多少道菜。但是这样的状态数太多了,我们发现这个DP的值域为 \(n\) ,很小,于是我们考虑更换一下状态。设 \(f_{i,j,s1}\) 表示当前吃到第 \(i\) 道菜,吃了 \(j\) 道菜,吃完的菜的属性 \(x\) 的总和为 \(s1\) ,值为吃掉的菜的属性 \(y\) 的总和,这样就可以大大减少状态数。

ARC 181

这几天打得都不好,一直掉分。我觉得我的问题在于一直跟着自己一开始的思路走,很少会去推翻重想,不停地试着去补足假做法。以后要换一种想题的方式,毕竟像 \(Atcoder\) 这样的比赛,不能浪费太多的时间。如果一个做法很难实现或会有很多不足的话,尽量就不要继续想了。

ARC 181-B

题意:给定三个字符串 \(S,a,b\) ,其中, \(S\) 由小写字母组成, \(a,b\)\(0,1\) 组成,若 \(a\) 的第 \(i\) 个字符为 \(0\) ,则在一个初始为空字符串 \(A\) 的末尾加上字符串 \(S\) ,若为 \(1\) ,则在末尾加上一个字符串 \(T\)\(b\) 同理。问是否存在一个字符串 \(T\) ,使得 \(A=B\)

解法:设 \(S\) 的长度为 \(len1\)\(T\) 的长度为 \(len2\) 。假设 \(len1>len2\) ,则我们将 \(S\) 变为 \(S'+T\) ,其中 \(|S'|=len1-len2\) ,然后带入原式;若 \(len1<len2\) ,那么就反过来。直到 \(len1'=len2'\) ,此时两个式子是相等的,那么我们只需要判断 \(S\) 中是否存在长度为 \(len1'\) 的循环节就好了。求 \(len2\) 时可以列一个方程来求,如果无解那么 \(T\) 就不存在。

ARC 181-C

题意:给定两个 \(n\) 的排列 \(a,b\) ,需要构造出一个 \(n\times n\)\(0/1\) 矩阵,使得每一行的字符串按字典序排序后的编号为 \(a\) ,每一列的字符串按字典序排列后的编号为 \(b\)

解法:手玩数据发现可以这样构造:先将矩阵中满足 \(i+j\ge n+1\) 的位置填满 \(1\) ,其余位置填 \(0\) ,然后将第 \(i\) 行填到满足 \(a_j=i\) 的第 \(j\) 行,再将第 \(i\) 列填到满足 \(b_j=i\) 的第 \(j\) 列。(为什么别人玩的出来我不行……)

ABC-366

上分好耶。G 题的知识点不难,但是我还是不会。要好好补一补小的知识点了。

ABC-366 G

题意:给定一个 \(n\) 个点, \(m\) 条边的无向图( \(n\le 60\) ),需要你给每个点赋一个值域在 \([1,2^{60}-1]\) 的值,要求每个点连向的点的异或和为 0 。

解法:考虑使用高斯消元异或方程组,根据顶点关系,我们可以列出方程组。接下来的消元也不难,关键在于对自由元的取值。若变量 \(i\) 为自由元,则我们将其赋值为 \(2^i\) ,因为它能够影响到的变量都\(<i\) 。但是好像不要取一些看上去就会错的值都可以(如1/0),有人取了 \(2^i-1\) ,有人直接 \(rand\)

还有一种做法是对于每一位做一遍高斯消元,每一个强制钦定某个自由元为 1,这样也可以避免取到 0 的情况。

有一个小地方,我以前没有注意到,就是在代码中出现的数字 \(1\) 它好像默认是 \(int\) 类型的,不能 1<<32 ,要打 1ll<<32

ABC-367

反复领会不罚时的重要性。自己想到解法的速度是很快的,但是对于细节的处理还是不够。还是得好好检查思路再来打。

E 题使用倍增相当好写,但是我当时看到环就在想循环节,分类讨论的情况多。

ABC-367 G

FWT,等学了再来

AGC-067

AGC-067 A

题意:给定一个无向图,问你这个图是否满足它的每个生成子图都存在一个大小至少为该生成子图大小的一半的团。

解法:结论:如果整个图可以被划分为至多 2 个团的话,答案为 Yes

证明:我们发现,对于一个奇数 \(x\) ,如果大小为 \(x\) 的生成子图可以被满足/不满足,则大小为 \(x+1\) 的生成子图也可以被满足/不满足。于是我们只用考虑更小的 \(x\) 。我们考虑对于 \(x\) 个点,如何构造一个边数尽可能多的图,使得这个图不能满足条件。发现当我们构造出来的图的补图存在一个 \(x\) 元环时,条件不会被满足。

所以我们在原图上的补图进行黑白染色,如果可以满足条件,则答案为 Yes 。对于一个大小为 \(x\) 的团,它需要 \(\frac{d*(d+1)}{2}\) 条边,由于 \(m\le 10^6\) ,所以 \(n\) 最大为 \(2002\)

ARC-183

军训期间没得打AT,暑假结束了还没有上到蓝名,可惜。

ARC-183 C

题意:给定 \(m\) 个条件,每个条件表示区间 \([l,r]\) 中的最大值不能在位置 \(x\) 上。问 \(n(n\le500)\) 的排列中有多少满足所有的条件。

解法:还是DP题做少了,计数DP的套路题都不会。容易想到区间DP,设 \(f_{l,r}\) 表示区间 \([l,r]\) 中,填入 \(1...r-l+1\) 这些数时,满足条件的有多少个。转移时枚举一个可以成为最大值的位置 \(k\)\(f_{l,r}=f_{l,k-1}*f_{k+1,r}*\binom{r-l}{k-l}\) ,由于我们只记录了相对的大小,所以最后要乘上组合数,表示这些数字要放在左边还是右边。

ARC-183 D

题意:给定一棵树,满足 \(2i\)\(2i+1\) 有连边。每次要选出两个叶子节点,将它们删除并且保证操作完的树仍是完美匹配,这次操作的贡献为选取的两点之间的距离。需要输出一种操作方案,将整棵树删掉,并使得贡献之和最大。

解法:首先要求贡献最大,联系之前做过的一道题就知道要以重心为根。接下来考虑如何删才能使得树仍然合法。我们随便取一个完美匹配,然后将匹配中的边标为 1,不是匹配中的边标为 0,然后我们可以发现,当两个点 \(x,y\) ,它们之间的路径为 01 交替时,它们就可以被删掉,并且路径上的边全部取反(异或上1)。而只有与重心 \(K\) 连了题目中保证的特殊边(\(2i\)\(2i+1\))的点,以该点为根的子树中,才会出现 1 的边。然后进行了一次操作后,另一个删除的点所在的子树又会出现 1 的边,而该子树中没有了 1 的边。所以我们每次取大小最大的子树与存在 1 边的叶子进行配对,然后不断重复,最后一个点与根配对。

最后还有一个问题,我们要保证删除的点到根的路径上的边是 01 交替的,所以我们在 \(dfs\) 时先搜索 0 的边,然后按照 \(dfn\) 从大到小取就好了。

ABC-370

终于上蓝名了,1605 Rating,还要防掉。累。

ABC-370 F

题意:给定一个环,环上的每个点有一个权值 \(a_i\) ,需要将这个环拆成若干个连续的区间,使得所有区间的总和的最小值最大。问这个值,以及所有满足最小值为这个值的方案中,有多少条环上的边不会被断开。

解法:比赛时没有想到倍增,导致二分时判断答案那里一直不会做。

看到最小值最大可以想到二分答案,设 \(mid\) 表示拆开的区间和的最小值为 \(mid\) 。然后将环复制一遍,变成序列。对于一个点 \(i\) ,我们贪心地将它指向最近的一个 \(j\) ,满足 \(i...j-1\) 的总和 \(\ge K\) ,表示选取一个合法的区间。然后倍增,设 \(f_{i,j}\) 表示第 \(i\) 个节点,跳了 \(2^j\) 个区间后会到哪个节点。最后我们判断这个节点与初始节点是否构成一个长度 \(\le n\) 的区间。

对于第二个答案,我们求出在上述过程中,有多少个点 \(i\) 是合法的就行了,表示我们一定会拆掉 \(i\) 前面的那条边。

ABC-371

做简单题的速度很快很准,\(25min\)\(A...E\) 切了,但是在思考的时候还不够全面,二分不够熟练,对于细节的处理也没有搞好,导致 F 做得慢还没有在考场上调出来。

ABC-371 F

题意:在一个一维平面内有 \(n\) 个点,这些点每次可以向左移动一格或向右移动一格,但是移动完后不能有两个点重合。现在有 \(m\) 个操作,第 \(i\) 个操作要求将 \(x\) 移动至位置 \(k\)。问完成这些操作的最小步数和。

解法:考虑如何快速算出一次操作会影响到那些点。当我们得知会影响哪些点后,求答案就是用区间和减掉最终状态。假设点 \(i\) 的位置 \(x<k\) ,那么对于 \(>i\)\(j\) ,如果它满足 \(x_j<k+(j-i)\) ,那么它就会被影响。我们将上面的式子移项得: \(x_j-j<k-i\) 。这启示我们将一个数的位置 \(x\) 减掉下标 \(i\) 变成新的位置 \(x'\) ,发现这样做不仅可以避免求会影响哪些点时,出现要判断当前点是否会影响后面的点的情况;还可以简化修改。于是我们开一棵线段树存新的位置的区间和、\(max\) ,然后在线段树上二分可以求出会影响哪些位置,然后求区间和算答案即可。

ABC-371 G

题意:给定两个排列 \(a,p\) ,可以执行无穷多次操作,每次同时将所有的 \(a_{p_i}\) 变成 \(a_i\) 。问可能得到的最小的序列 \(a\) 的字典序为多少。

解法:先将所有的环找出来,然后贪心地考虑每个环上的数的位置。设最终要执行 \(C\) 次操作,则我们每次确定一个长度为 \(l\) ,在满足前面的限制下,最优的位置会由操作 \(x\) 次得到的环,就会产生一个 \(C\%l=x\) 的限制。我们考虑暴力地判断是否满足条件。对于两个长度相等的环,后面的环的操作一定是和前面的一样;对于其他情况,我们暴力枚举 \(x\) ,然后判断是否满足所有限制条件,最后取满足限制条件的最小的就行了。时间复杂度为 \(O(n\sqrt n\log n)\)

ABC 374

连着两场没有切掉 E 了,掉回青名了,\(QwQ\)

ABC 374-E

题意:给定 \(n\) 个选择,第 \(i\) 个选择可以从两种机器中选出若干个,机器分别是花费 \(c_i\) 元可以获得 \(a_i\) 个单位的产品和花费 \(d_i\) 元可以获得 \(b_i\) 个单位的产品。问在给定总费用上限 \(X\) 后,能够在每个选择中获得的产品的最小值最大是多少?

解法:比赛时列了一个函数,还以为它是单峰,结果因为这个挂了。

首先二分答案 \(mid\) 。然后考虑如何计算每个取到 \(mid\) 个时的最小钱数,考虑购买性价比高的,但是又不一定最优。此时注意到 \(a_i,b_i\le100\) ,假设第一个机器的性价比更高,则有 \(c/a<d/b\) ,那么当我们购买了 \(b_i\) 个第二个机器时,肯定不如用这些钱购买第一个更优,于是我们枚举性价比低的机器的购买个数,然后算出另一个机器的购买个数,取最小钱数就好了。

ABC 374-F

题意:给定 \(n(n\le100)\) 个货物,每个货物有一个可以开始发货的时间 \(T_i(T_i<=10^{12})\) ,每次可以同时发最多 \(K\) 个货,每发一次货就有 \(X\) 的发货冷却。定义不满意度为第 \(i\) 个货物被发送的时间与 \(T_i\) 之差。问最小的不满意度之和。

解法:设 \(f_{i,j}\) 表示当前的时间为 \(i\) ,已经发送了前 \(j\) 个货。由于时间可能非常大,无法直接DP。但是发现 \(n\) 很小,通过贪心发现有用的时间点只有 \(O(n^2)\) 个,对于每个时间点额外记录 \(n\) 个时间点 \(T_i+X*a(1\le a\le n)\) ,这样就减少了第一维的数量。我们继续贪心,考虑到每到达一个时间点,我们要么不发送,要么尽可能多发。于是可以设计出转移式。时间复杂度 \(O(n^3)\)

ABC 374-G

我!怎!么!不!会!\(tanjan\)

题意:给定 \(n\) 个长度为 2 的,由大写字母组成的字符串。需要将这些字符串首尾拼接起来,一个字符串可以使用多次。问至少需要拼接成多少个字符串,使得 \(n\) 个字符串都被用到。

解法:最小路径覆盖的题。由于是一般图,所以先将每个字符串向能够拼接在它后面的字符串连边,然后跑 \(tanjan\) 缩点。接着对缩过点的图进行操作。这里的最小路径覆盖是可以重复经过一条边的,所以我们跑一遍 \(Floyed\) ,将每个点向它的子树内的所有点连边,这样问题就转化为不可以经过重复路径的了。接下来我们对于图上的每一个点,将它拆成两个,对于每一条边 \(x\to y\) ,将 \(x\) 拆出来的第一个点连向 \(y\) 拆出来的第二点。然后从源点向所有拆出来的第一个点连边,所有拆出来的第二点向汇点连边。以上连的边的流量均为 1 。然后我们跑出这个图的最大流,此时 点数-最大流 即为答案。这里可以感性理解一下,对于每个没能对最大流进行贡献的点,没有点流向它,即它将成为一条路径的开头,我们最大化路径的开头的点数,就可以最小化路径数。

由开头可知,这道题对于笔者的难度不在于后面的网络流,所以补一下 \(tanjan\)

我们从有向图中任意一个没有被遍历过的点跑 \(tanjan\) 。我们需要求出每个点的 \(dfn,low\) ,分别表示一个点被遍历的顺序和它能够到达的所有点的最小的 \(dfn\) 。再维护一个栈,里面存放所有 搜过的点。

搜索过程中,对于 \(x\) 连向的一个点 \(y\) ,当它还没遍历过时,我们先搜索它,回溯后根据 \(low\) 的定义,将 \(low_x\) 更新为 \(min(low_x,low_y)\);当它已经被遍历过而且在栈中时,我们将 \(low_x\) 更新为 \(min(low_x,dfn_y)\);当它已经被遍历过而且不在栈中时,我们不需要进行任何操作,因为如果它会和当前的 \(x\) 产生强联通分量,那么在它被搜索的时候已经处理掉了。回溯时,对于一个点 \(x\) ,如果它满足 \(dfn_x=low_x\) ,那么我们进行弹栈,直到将 \(x\) 弹出,这些弹出的点都会和 \(x\) 缩在一个强联通分量中。

ABC 375

第一次AK!!!开心!

感谢昨天才打的 \(tanjan\)

做E、F的时候人傻了,E题甚至打了个费用流,F题打了个暴力。打之前要想想正确性,算一算复杂度,避免罚时。

ARC 185

还是有很多知识不会,例如 C 题的 NTT 和 E 题的欧拉函数,了解的不够多,需要慢慢发掘,及时补足。

ARC 185-C

放了好久的 NTT 现在才做……

题意:给定 \(n\) 个数和一个值 \(m(n,m\le10^6)\) ,每个数 \(a_i\le m\) ,需要构造一组下标 \(i,j,k\) 满足 \(i<j<k,a_i+a_j+a_k=m\)

解法:考虑如何快速计算两个数的和的情况,将每个数看做 \(x^{a_i}\) ,然后跑 NTT ,去重,就可以求出所有 \(a_i+a_j\) 的情况。有个这个之后构造解是容易的。

可以先去重,因为一个数如果使用了两次,那么剩下的数是确定的。这样就可以不用大模数 NTT 了。

ARC 185-E

题意:给定一个长度为 \(n(n\le 5*10^5)\) 的序列 \(a\) ,其中 \(a_i\le10^5\) 。定义一个序列的权值为该序列相邻两个数的 \(gcd\) 之和。对于 \(i\in[1,n]\) ,求出 \(a\) 序列的前 \(i\) 个数构成的序列的所有子序列的权值。

解法:首先可以将题目要求的东西转化为:设 \(ans_i\) 表示 \(i\) 的答案,则 \(ans_i=2*ans_{i-1}+\sum_{j=1}^{i-1}2^{j-1}gcd(a_i,a_j)\) ,由于对于任意的正整数 \(n\) ,都有 \(n=\sum_{d|n}\varphi(d)\) ,然后我们接着变式子:

\[\sum_{j=1}^{i-1}2^{j-1}gcd(a_i,a_j)=\sum_{j=1}^{i-1}2^{j-1}\sum_{d|a_i}\varphi(d)[d|a_j]=\sum_{d|a_i}\varphi(d)\sum_{j=1}^{i-1}2^{j-1}[d|a_j] \]

此时我们可以预处理出所有的 \(\varphi(d)\) ,并且开一个数组,记录所有 \(i\) 之前的数对于 \(a_j\) 的因子 \(d\) 的贡献,就可以快速计算后面的一个 \(\sum\)

ABC 376

C 题成为最大滑铁卢。因为自己习惯设 \(inf=10^9\) ,然后它的数据范围就是 \(\le10^9\) ,然后一直有一个点过不去,以后要把这个习惯该掉,再设大一点。

ABC 376-G

题意:给定一棵以 \(0\) 为根, \(n+1\) 个节点的树 \((n\le 2e5)\) 。每个节点上有一个权值 \(a_i\) ,表示在该点找到宝藏的概率为 \(\frac{a_i}{\sum a_j}\) 。当一个节点的父节点被探索过后,该节点才可以被探索。现在只有节点 0 被探索了,问按照最优策略找到宝藏的最小期望是多少,对 998244353 取模。

解法:首先我们发现一个节点的子树内的点会对我们的选择有影响,所以我们考虑对于整张图如果去掉了 “只有父节点选了之后才能选” 的限制后如何处理,那么我们只需要将所有的 \(a_i\) 丢进一个堆里,每次取出最大的就好了。此时,假如我们取出来一个节点,在限制下其实是无法探索的,那么我们在探索完它的父节点后,一定会先探索该节点。这样我们可以考虑把该节点和它的父亲合并起来,并赋予一个新的权值。那么我们现在需要找到一个正确的权值比较方法。

先将答案的式子写出来:\(\sum a_{p_i}i\) ,其中 \(p\) 是按最优策略选出来的一个排列。对于与 \(i\) 合并了的点构成的连通块,设只探索该连通块对答案的贡献为 \(val_i\) ,该连通块的概率总和为 \(sum_i\) 。假设连通块 \(i\) 的次序在连通块 \(j\) 前面,那么就要满足 \(val_i+siz_i*sum_j+val_j<val_j+siz_j*sum_i+val_i\) ,解出来就是 \(\frac{sum_i}{siz_i}>\frac{sum_j}{siz_j}\) 。于是我们根据这个式子,将所有的点丢进一个堆里,然后将每次取出来的节点和父亲合并,并记录取出来的顺序。最后按照这个顺序跑一遍,注意和父亲合并,计算结果就好了。

ARC 186

不会计数题,大失败。于是一直在做 T3 ,一开始的思路把自己弄晕了,应该根据放球的人的策略先写出答案的式子再继续去推。

ARC 186-A

题意:定义两个大小为 \(N*N(N\le30)\) 的01矩阵是相似的,当且仅当它们每一行每一列上的数之和都与另一矩阵对应的行和列上的数之和相等。定义01矩阵 \(A\) 中一个位置是固定的,当且仅当对于与 \(A\) 所有相似的矩阵 \(B\) ,该位置上的值不变。有 \(Q\) 个询问,每次问你是否存在一个01矩阵满足该矩阵上所有固定的位置的数量等于 \(K_i\)

解法:考虑如何从一个矩阵变换到一个相似的矩阵。不难发现如果存在一个矩形满足它对角上的位置的数相等且相邻的顶点上的数不相等,那么就可以将这四个位置上的数进行交换。发现这个条件是充要的。接着考虑怎么使用这个结论。我们可以选择一些矩形,使得在同一行或同一列中至多只有一个矩形,然后我们在这些矩形中交替地填上 01 ,对于不在矩形中的位置,我们可以通过右上半部分填 1 ,左下填 0 的方式,使得只有这些矩形中的点不固定,而且不同矩形中的点互不干扰。于是就可以 DP 了。时间复杂度 \(O(N^6)\)

ARC 186-B

题意:给定一个长为 \(n(n\le 3*10^5)\) 的序列 \(a\) ,第 \(i\) 个数字 \(a_i\) 满足 \(0\le a_i<i\) ,表示对于所有的 \(a_i<j<i\) ,在一个 \(n\) 的排列 \(b\) 中都要有 \(b_j>b_i\) ,且 \(b_{a_i}<b_i\) 。问有多少个排列 \(b\) 满足所有条件,对 \(998244353\) 取模。

解法:通过不等式,我们可以从小的连向大的,这样问题就变成了拓扑序计数。但是这个问题是 NP 的,所以我们考虑寻找一些性质。我们通过那些从 \(a_i \to i\) 的边建出一棵树,发现对于一个点,它如果可以被取出来,当且仅当比它编号大的兄弟和父节点都被取出来了。于是我们可以根据这个性质从下往上处理出每一棵子树内全部取出的方案数,然后用组合数去求就好了。

具体求的方法是:每次合并两棵子树,相当于把编号大的那棵子树的根节点拿走,剩下的节点去做插板,然后将那个点放在序列最前面。但是这样只可以从编号小的开始合并,不然会出问题(可手模一个节点,有三个大小不小于2的子树的情况)。

ARC 186-C

题意:有两个人在玩游戏,第一个人有 \(M\) 种颜色的球,每种球有无数个,同时有 \(N(N\le3*10^5)\) 个盒子,每个盒子有价格 \(p_i\) 和体积 \(v_i\) 。现在第一个人每次要给第二个人一个球,第二个人可以在任意时刻购买盒子,并把球放到一个已经购买的盒子里去。一个盒子里的球只能有一种颜色,且球的数量不能超过体积。每成功放入一个球,第二个人可以获得 1 元,否则游戏结束。第二个人可以在任意时刻结束游戏,且钱数可以为负数。现在第一个人想要让第二个人的最终钱数尽量少,第二个人想要自己的最终钱数尽量多,问如果两人均以最优策略进行游戏,第二个人的最终钱数是多少?

解法:考虑第一个人的最优策略:不管第二个人买了多少盒子,他只需要尽量减少第二个人能放球的机会就行了。所以第一个人一定先给第二个人 \(M\) 种颜色的球各一个,然后再选择 \(v\) 最小的、已经被购买的盒子进行填满,并不断重复。

因此第二个人最终购买的盒子中, \(v\)\(M-1\) 大的是一定不能够填满的。所以我们先将所有的盒子按 \(v\) 从大到小排序,接着枚举分界点 \(i\) ,表示 \(i\) 之前的盒子如果购买了,那么一定无法被填满;而 \(i\) 之后的盒子如果购买了,是可以填满的。对于前面的一部分,我们贪心地去选出 \(p\) 最小的前 \(M-1\) 个,对于后面的部分,我们贪心地选择所有 \(v-p>0\) 的盒子即可。

ARC 186-D

题意:定义一个序列是 \(\text{Polish}\) 的,当且仅当将它的开头 \(a_1\) 取出来后,剩下的序列可以被拆分成 \(a_1\) 个连续的序列,且这些序列都是 \(\text{Polish}\) 的。特别的, \(\{0\}\)\(\text{Polish}\) 的。

现在给定一个长为 \(n(n\le3*10^5)\) 的序列 \(a\) ,问有多少个长度为 \(n\)\(\text{Polish}\) 序列满足它的字典序不大于 \(a\) 。对 \(998244353\) 取模。

解法:由于一个 \(\text{Polish}\) 序列的最后一位是确定的,一定为 0 ,所以我们考虑从后往前如何构造一个 \(\text{Polish}\) 序列。通过手玩可以发现,一个位置如果填 \(x\) ,则它可以和它后面的 \(x\)\(\text{Polish}\) 序列合并成一个 \(\text{Polish}\) 序列。如果 \(x\) 填 0 ,则它自己变成一个 \(\text{Polish}\) 序列。如果后面不足 \(x\)\(\text{Polish}\) 序列,则该位置填 \(x\) 是不合法的。如果开头没有把所有的 \(\text{Polish}\) 序列合并,那么也是不合法的。我们将这个判断的方法写成式子:\(\forall i\in[1,n],\sum_{j=i}^na_j\le n-i;\sum_{j=1}^na_j=n-1\)

接下来我们根据这个式子求方案数,我们可以先将这个式子对称,变成对前缀进行限制,容易处理。先不看字典序的限制,求该式子的方案相当于将 \(\sum a_i\) 当作 \(x\)轴 , \(i\) 当作 \(y\)轴,从点 \((0,1)\) 走到点 \((n-1,n)\) 且不经过直线 \(y=x\) 的方案数。求这个方案数可以利用对称,假设当我们走到不合法的直线上时,我们以后的路径关于 \(y=x\) 对称,于是终点就变成了原来的终点关于 \(y=x\) 对称的点。所以我们先求一遍到原来的终点的方案数,减去到对称的点的方案数就行了。

接下来考虑加入字典序的限制。由于我们对序列进行了翻转,所以我们每次修改的是终点。枚举当 \(i\) 之前的位置都取到最大值时,\(i\) 没有取到最大值的所有情况。由于最多走到 \(n-1\) ,实际上它最多只需求 \(n-1\) 次。最后再判断一下 \(a\) 是不是 \(\text{Polish}\) 序列就行了。

VP AGC 037

\(ky\_star\) 大法好。

AGC 037-B

题意:给定由三种颜色、每种颜色有 \(n(n\le 2*10^5)\) 个的字符串,需要给 \(n\) 个人分配不同的三种颜色。定义一个人产生的代价为:他分到的颜色在字符串中的位置的 最大值-最小值 。问使所有人产生的代价和最小的方案数有多少?对 \(998244353\) 取模。

解法:考虑一步一步做,先将一种方案求出来。可以贪心地去求一组方案,当枚举到一个没有被取过的颜色时,我们找到在它之后最近的其他两种颜色,然后将它们按顺序标记为 \(-1,0,1\) 。这些数字表示它们对代价和的贡献。

接着考虑计算方案数。对于一个 \(0\) ,它可以和前面的 \(-1\) 分配在一起,但是要减去已经被分配了的 \(-1\) 的个数。\(1\) 同理。最后由于 \(n\) 个人有标号,所以要乘上 \(n!\)

AGC 037-D

题意:给定一个 \(n*m(n,m\le100)\) 的矩阵,其中填满了 1 到 \(n*m\) 这些数。需要按顺序执行以下操作,分别是:

  1. 重新排列每一行;
  2. 重新排列每一列;
  3. 重新排列每一行。

需要构造一种方案,使得最终的矩阵满足格子 \((i,j)\) 上的数为 \((i-1)*m+j\)

解法:观察样例,设最终矩阵中,每一行上的数为一组。第一步操作需要我们将每一列上的数排列成两两之间不能为同一组,第二步操作需要我们将同一组的数放在同一行。第二步是容易的,接下来考虑第一步要如何去做。

根据数据范围,想到网络流。将每一组的点染成一种颜色,然后每一行视为一个点,将该点向该行上所有的颜色连边。这个问题可以对于每一列按顺序处理,所以就是要对于每一列,求出一个完美匹配。跑 \(m\) 次最大流就好了。

ABC 379

太可恶了,C题少了特判石子多余的情况,差一点就 AK 了。而且由于自己没有 Rating ,导致打的时候不是很专注,以后要准时参加,要 Rating 。

VP AGC 020

AGC 020-C

题意:给定一个长度为 \(n(n\le2000)\) 的集合,\(a_i\le2000\) ,问这个集合的所有子集的元素和(不算空集)构成的序列的中位数。

解法:设 \(sum\) 表示集合的元素和。考虑一个子集和它的补集,它们的元素和相加一定等于 \(sum\) ,而且我们不计算空集,所以答案即为能构造出来的 $\ge\left \lceil\frac{sum}2\right \rceil $ 的第一个数。使用 DP + bitset 优化解决。

AGC 020-D

题意:有 \(Q(Q\le 10^3)\) 次询问,每次询问给定四个数 \(a,b,l,r(r-l+1\le100;a,b\le10^8)\) 。需要你构造一个由 \(a\) 个 A 和 \(b\) 个 B 组成的字符串,需要它最长的同种颜色段尽量短,在此前提下满足该字符串的字典序最小。需要输出第 \(l\) 个字符到第 \(r\) 个字符。

解法:先求出最长的相同颜色段的长度,设其为 \(k\) ,则 \(k=\left \lceil\frac{max(n,m)}{min(n,m)+1}\right \rceil\) 。接着手模几个数据,观察一下,发现字符串大概是长成这样:分成前后两段,前面一段从前往后由 \(k\) 个 A 和一个 B 这样的小段不断重复排列;而后面一段从后往前是由 \(k\) 个 B 和一个 A 这样的小段不断重复排列。而且在分界线的左边为 A,右边为 B。

那么我们二分该分界线,后半部分需要满足 \(b>a*k\) 。然后分两半输出就好了。

ABC 380

没打出来 F ,没有想到如何计搜,状态还是不大好。

ABC 380-F

题意:有两个人 A、B,A手上有 \(n\) 张牌,\(B\) 手上有 \(m\) 张牌,桌面上有 \(K\) 张牌 \((n+m+K\le12)\)\(A\) 先手,每次轮到一个人可以有两种操作:一是将手上的一张牌与桌面上点数小于该牌的牌交换,二是将手上的一张牌放到桌牌上。谁不能操作谁输,问谁会获胜?

解法:由于牌的总数很小,所以使用 三进制状压+记忆化搜索决策树 解决。注意记忆化时要记录是谁的回合。

ABC 380-G

题意:给定一个 \(n(n\le2*10^5)\) 的排列和一个常数 \(K(K\le n)\) ,问在排列中随机选取一个长度为 \(K\) 的子序列,然后随机打乱后得到的排列中,逆序对的期望个数。答案对 998244353 取模。

解法:考虑直接计数。首先可以通过不断加入一个数,推出 将一个长为 \(x\) 的排列打乱后的逆序对期望个数。设 \(f_x\) 表示期望个数,则 \(f_x=x*f_{x-1}+\frac{x*(x-1)}2*(x-1)!\) 。然后剩下的部分就是使用一个移动窗口,每次计算整个排列中,不算移动窗口中的数的逆序对数量。

ARC 187

怎么不会B?

ARC 187-B

题意:对于一个序列 \(A\) ,定义 \(f(A)\) 表示将序列 \(A\) 中每对满足 \(i<j,a_i\le a_j\)\((i,j)\) 连一条无向边,最终得到的图的连通块数量。现在给出一个长度 \(n\) 的序列 \(a\) 和一个常数 \(m(n,m\le2000)\) ,满足 \(a_i\) 要么等于 -1 ,要么在 \([1,m]\) 内。问将所有 -1 替换成 \([1,m]\) 中的一个数后,得到的所有序列 \(a'\)\(f(a')\) 的和。答案对 998244353 取模。

解法:先找出产生一个连通块的判断方法。若 \(i\) 满足它的前缀 \(min\) 大于 \(i+1\) 的后缀 \(max\) ,则 \(i\) 之前的数不会与 \(i+1\) 之后的数连边,于是产生了一个连通块。那么我们就通过这个结论,用组合数算一下就好啦。

VP AGC 019

AGC 019-D

怎么都想到结论了还是做不出来?

题意:给出两个长度均为 \(n(n\le2000)\) 的 01序列 A、B。现在有三种操作:将 序列A 整体向左移或向右移,超出的部分在另一边补;对于一个 序列B 上的 1 ,将 序列A 的对应位置上的数取反。问最少操作多少次可以使 A 变成 B 。

解法:由于不好判断一系列操作后的 A 能否通过移动得到 B ,再加上 \(n\le2000\) ,考虑钦定最终是哪些点需要变为 1 。那么其余需要从 1 变成 0 的位置就要在移动过程中操作。处理出每个位置向左和向右的第一个 B 上的 1 在哪里,如果一个位置不能在移动过程中被操作成 0 ,就需要额外跑一下。那么我们贪心地去做,将所有需要变换的位置放在一个数组里排序,那么钦定某个位置为分界线,该位置左边的点全部向左跑,右边的点全部向右跑,后缀\(max\) 处理一下就好了。

AGC 019-E

题意:给定两个长度为 \(n(n\le10^4)\) 的 01序列A、B,两个序列的 1 的数量相同,设 A 序列中 1 的位置分别为 \(a_1,a_2...a_k\) ,B序列中 1 的位置分别为 \(b_1,b_2...b_k\) 。将 \(a,b\) 两个数组随机打乱后,对于每个 \(i\in[1,k]\) ,按小到大的顺序将 A序列 中位置为 \(a_i\)\(b_i\) 的两个数交换。问最后 A序列 和 B序列 相同的期望。乘上 \((k!)^2\) 后对 998244353 取模。

解法:不会生成函数解法……

将原序列中同一个 \(i\) 在 A、B 上的数绑在一起考虑。

那么当这个数为 00 时,我们不会操作它,不用考虑;

当这个数为 10 时,它将成为某次交换的起点,因为它会将 1 交换出去;

当这个数为 01 时,它将成为某次交换的终点,因为它需要一个 1 ;

当这个数为 11 时,它将成为某次交换的中转点,因为它可以交换两次。

我们设 起点/终点 的个数为 \(m\) ,中转点的个数为 \(n\) 。那么将每个点向它要交换的点连边后,整个图就是 \(m\) 条链以及若干个环。考虑环如何处理。设 \(f_{i,j}\) 表示当前使用了 \(i\) 个中转点,构成了 \(j\) 条链,那么转移就是:

  • 加入一个中转点,将它放在某一个链的末端,考虑加入的链与标号:\(f_{i-1,j}*i*j\to f_{i,j}\)
  • 增加一条链,放在所有链的最后,考虑起点与终点的标号:\(f_{i,j-1}*j^2\to f_{i,j}\)

发现题目中的操作序列实际上是有顺序要求的,这里的顺序要求实际上通过转移顺序解决了。

那么接下来处理环的情况,设有 \(i\) 个点构成了环,那么需要在 \(n\) 个中转点中选出 \(i\) 个,给它们标号和顺序,再乘上链的方案数,以及将它们插入整体的顺序的方案数。

\[ans=\sum_{i=0}^n\binom ni*(i!)^2*f_{n-i,m}*\binom{n+m}i \]

AGC 019-F

题意:有 \(n+m(n,m\le5*10^5)\) 道判断题,其中有 \(n\) 道是对的,\(m\) 道是错的。每回答一道题就可以知道该题的答案。问在最优答题策略下,期望答对几道题?对 998244353 取模。

解法:钦定 \(n>m\) 。先考虑最优策略:当 \(n,m\) 不相等时,回答最大的那个;当它们相等时,回答任意一个都可以,不妨设为回答 \(n\) 。那么可以建出网格图,每答一题就相当于在上面走 横坐标或纵坐标-1 的一步,将最优策略构成的路线在网格图上画出来,然后答案就变成了 所有正确答案构成的路线与最优策略重合的长度 除以 \(\binom{n+m}n\)

发现如果没有在直线 \(y=x\) 上向下走的那一部分是很好求的,期望为 \(n\) 。那么我们特别处理这一部分,那么就是对于每个 \((i,i)\) ,求出经过 \((i,i)\)\((i,i-1)\) 的路径数既可。最终答案除以总方案数加上前半部分的 \(n\) 就好了。

ARC 188

打的不错,切掉了 AB,但是在最后没有好好地想 C。前三题其实都不难。

ARC 188-C

题意:有 \(n\) 个人,\(m(n,m\le2*10^5)\) 条证词,每条证词形如 \(x,y,0/1\) ,表示第 \(x\) 个人指认第 \(y\) 个人是诚实者或是撒谎者。诚实者的指认都是正确的,撒谎者的指认都是相反的。但是每个人都有可能是“混乱的”,如果一个人是混乱的,那么他的证词都是相反的。需要构造一组这些人可能的混乱情况。

解法:由于有二元关系,那么可以想到 \(2-SAT\) 。但是一共有四种情况,所以我们要整出两组二元关系。我们将每个人分成两种属性:是否说真话与是否诚实。设是否说真话为 \(A\) 属性,是否诚实为 \(B\) 属性。当 \(x\) 指认 \(y\) 是诚实的时候,那么说明如果 \(x\) 说真话,则 \(y\) 为诚实者;如果 \(x\) 说假话,则 \(y\) 为撒谎者。指认为撒谎者的时候类似。这些关系互为充要条件,所以连双向边。接着跑 \(2-SAT\) ,判无解后,考虑如果一个人既诚实又说假话,或他既撒谎又说真话,则说明他是混乱的,否则为清醒的。

ABC 382

我怎么不会概率啊!

ABC 382-E

题意:有无数包一样的卡包,每包卡里有 \(n(n\le5000)\) 张卡,第 \(i\) 张卡为稀有卡的概率为 \(p_i\) 。问开出 \(m(m\le5000)\) 张稀有卡的期望打开卡包次数。

解法:看到怎么设 DP 的时候就已经知道怎么做了,还要多练概率、期望题。

\(f_i\) 表示开一包卡得到 \(i\) 张稀有卡的概率,\(g_i\) 表示得到 \(i\) 张稀有卡的期望开包次数。\(f\) 可以通过 \(O(n^2)\) 的 DP 求出。\(g\) 的转移式为: \(g_i=1+\sum_{j=0}^ig_j*f_{i-j}\) ,由于方程式两边都有 \(g_i\) ,所以通过移项得到可以递推的方程式。

ARC 189

自己掌握的套路还不够多,B 题从差分数组的方向考虑就可以直接做出来了。以及自己的审题不清楚,C 题不仅以为排列建出的图是基环树森林,还没有注意到题目是给定了球最终的位置。D 题思考不够迅速、全面,差点就打出来了。以后要多做题,认真申清题面,还有如果思考一道题太久没有什么思路,就去开另一道题。

ARC 189-B

题意:有一个长度为 \(n(n\le2*10^5)\) 的严格递增的数列,可以做若干次如下操作,问最后序列中数的和的 可能的最小值 是多少?

操作:选定连续的四个数,从小到大设为 \(a,b,c,d\) ,将 \(b,c\) 的数值关于 \(\frac{a+d}2\) 对称,然后将整个数列排个序,保证严格递增。

解法:考虑它的差分数组如何变化。不难发现对于 \(i\) 进行操作,则将位置 \(i\)\(i+2\) 上的差分数组交换。

ARC 189-C

题意:给定两个长度为 \(n(n\le2*10^5)\) 的排列 \(P,Q\) ,每个点 \(i\)\(a_i\) 个红球,\(b_i\) 个蓝球 \(a_i,b_i\le1\)。当对一个点进行操作时,该点的所有红球会放到点 \(P_i\) 上,所有蓝球会放到点 \(Q_i\) 。问将所有球放到点 \(X\) 上的最小操作数。

解法:首先通过排列建图,可以得到若干个环,最终只有 \(X\) 所在的两个环是有用的。那么将这两个环从 \(X\) 的上一个点那里断环成链,再减掉两个序列末尾没有球的位置,所以答案即为 两个序列的长度和减去 两个序列的最长公共子序列长度 。

ARC 189-D

题意:有 \(n(n\le5*10^5)\) 个史莱姆,每个史莱姆有 \(a_i(1\le a_i\le10^9)\) 的体积,当一个史莱姆的体积大于相邻的一个史莱姆的体积时,它可以将其吃掉,体积变为两者相加。现在要对于每一个 \(i\in[1,n]\),问第 \(i\) 个史莱姆的体积的可能的最大值。

解法:不难想到一个最暴力的解法,设当前的史莱姆编号为 \(i\) ,先向左拓张到第一个比 \(a_i\) 大的,再向右拓张到第一个比 \(a_i\) 大的,然后重复这个过程直到无法继续。可以发现每进行这样的一次向左向右的拓张,\(a_i\) 至少 \(*2\) ,所以操作次数不会大于 \(\log A\) ,于是这样的时间复杂度为 \(O(n\log n\log A)\)

但是还有更快的方法。将每一个数从大到小来做,每次找到左右两边第一个比当前点 \(i\) 大的点 \(x,y\) ,如果区间 \([x+1,y-1]\) 的和要大于 \(a_x\) ,则 \(a_x\) 能够拓张到的区间,\(i\) 也能拓张到,\(y\) 同理。于是我们就可以找到 \(i\) 能够拓张到的区间了。由于大小相同的点无法拓张,所以要特判一开始就无法拓张的情况。时间复杂度为 \(O(n\log n)\) ,使用搜索可以做到 \(O(n)\)

ARC 189-E

题意:对于一个大小为 \(n(n\le 20)\) 的无向完全图,需要你对每一条边定一个编号,使得不存在一条 可以不重不漏地经过每一个点,且路径上的编号不递减 的路径。要求输出一组构造的方案,满足可能的最大值最小。

解法:首先可以通过归纳证明,只用编号为 1、2 的边无法满足上述情况。设当前已经走完了前 \(n-1\) 个点,接下来要走第 \(n\) 个点,且当前路径满足编号不递减。如果位于第 \(n-1\) 个位置上的点可以直接走就走,否则找到 1 和 2 的交界处,然后插到中间或向后一个位置。

接下来通过构造可以得到一个最大值为 3 的序列。将所有点尽量平均地分成四份,分别编号为 \(1...4\) ,其大小递减,那么对于点对 \((1,3),(2,4)\) ,我们都连 1 的边;对于 \((1,2),(3,4)\) ,连 2 的边;其余都连 3 的边。此时可以发现,如果 点集1 的大小大于 点集2 和 点集3 的大小,则该构造是错误的。但是这种情况只有在 \(n=5\) 时出现,所以将样例 D 下来就好了。

ABC 384

大失败,A 题没注意输入时的细节,有时要输字符串,有时要输的是单个字符。E 题没开 long long 且对数值的估算不够准确。F 题想着能不能有一种排序方法,使得存在某个分界点,使得该分界点前面的和后面的贡献都可以很好算出来。但是有不少边界情况。

ABC 384-F

题意:定义函数 \(f(x)\) 的值为 \(x\) 去掉所有质因子 2 后的数。现在给定一个长度为 \(n(n\le2*10^5)\) 的数列 \(a(1\le a_i\le10^7)\) ,求 \(\sum_{i=1}^n\sum_{j=i}^nf(i+j)\)

解法:考虑差分,设 \(g_i\) 表示所有满足相加后在 \(mod\ 2^i\) 的意义下为 0 的数对 \((i,j)\)\(a_i+a_j\) 之和。这样所有相加后第一个二进制上的 1 在第 \(i\) 位的数对的和为 \(g_i-g_{i+1}\) 。于是就可以贡献答案了。

ABC 387

数位 DP 没有打好,C 题被卡了。F 题把数组开到了 2025 刚刚好会越界,WA了两发,下次打这种比赛数组开多大开多大,反正一般不卡。

ABC 387-E

题意:定义一个数是好的,当且仅当这个数可以被 它的各个数位上的数的和 整除。现在给定 \(n(1e5位)\) ,需要你找到一个 \(x\) ,满足 \(x\in[n,n*2)\) ,且 \(x\)\(x+1\) 都是好的。

解法:首先发现我们可以在一些数位上填很多个 0 ,使得最终的数位和不超过 10 ,那么这样的话是很好构造的,可以根据 2、3;8、9 来构造出几组。当 \(n\) 很大的时候,它可以覆盖掉很多整的数,比如我们前面构造出来的几组,对于这一部分,可以根据 \(n\) 的最高位来分讨;当 \(n\) 较小时,直接暴力解决。

ABC 388

降低实现复杂度的能力还是不够,F 题想出了结论,却一直用一种很麻烦的方法实现,而且特殊情况也没有判好。遇到难题不会去换到下一道题,因为 G 题的结论在 E 题已经想到了,所以做起来并不会很难。

ABC 388-F

题意:有一条数轴,你需要从 1 开始,每次走 \(x\in[A,B](1\le A \le B\le20)\) 步,有 \(m(m\le20000)\) 个区间中的点不能走。问能不能走到 \(n(n\le10^{12})\)

解法:容易发现当一段空隙大于 \(A*B\) 时,一定是可以直接从下一个区间的左端点的前一个位置开始走的,因为我们可以通过走这一段空隙使得接下来的 \(B\) 个格子都可以走到。那么我们就将每一段长度大于 \(A*B\) 的空隙缩成 \(A*B\) ,然后跑最暴力的解法就好了。\(A=B\) 要特判。

ABC 388-G

题意:给定一个长为 \(n(n\le2*10^5)\) 的序列 \(a\) ,满足 \(a_i\le a_{i+1}\) 。定义两个位置 \(i,j\) 时配对的,当且仅当 \(a_i*2\le a_j\) 。现在有 \(Q(Q\le2*10^5)\) 个询问,每次问在一个区间里,至多可以同时配对多少对数,不可以使用相同的下标。

解法:先处理出 \(f_i\) 表示下标 \(i\) 往后的第一个可以配对的数的下标。然后考虑二分答案,对于每个询问,我们贪心地判断区间中的前 \(mid\) 个数能否全部配对。判断时,我们可以使用线段树维护一段区间中,将该区间内的所有数分配一个匹配所需的最大被配对的数的下标。总的时间复杂度为 \(o(n\log^2n)\)

ABC 389

大失败,E 题的式子推错了,罚了很多发,没有成功上大分。

ABC 389-G

题意:给定一个 \(n(n\le30)\) 和一个模数 \(P\) ,需要对于每个 \(m\in[n-1,\frac{n(n-1)}2]\) 求出:用 \(m\) 边连接这 \(n\) 个点变成一张无向连通图的方案数,满足 到 1 的最短路的距离为奇数 的点的个数等于 到 1 的最短路的距离为偶数 的点的个数。

解法:考虑 DP。不难想到按层DP,同时每一个点只会与同一层或上一层的点相连。设 \(f_{dep,s1,s2,la,i}\) 表示当前 DP 到的深度为 \(dep\) ,有 \(s1\) 个点的最短路距离为奇数,有 \(s2\) 个为偶数,上一层有 \(la\) 个数,已经连了 \(i\) 条边。为了方便转移,我们再设 \(g_{x,y,z}\) 表示上一层有 \(x\) 个,当前层有 \(y\) 个点,当前层会连 \(z\) 跳边 的方案数。转移不难,记得给点标号时方案数要在转移时贡献。

AGC 070

AGC 070-C

题意:你需要计算满足以下条件的数列的个数,对 \(1e9+7\) 取模。

  • 数列长度为 \(n(n\le2*10^7)\) ,由 A、B、C 组成。并且不能有连续的 A 或连续的 B ,要求 A 出现了 \(a\) 次,B 出现了 \(b\)\((a\ge b,a+b\le n)\)。并且对于任意一段前缀,A 成出现次数不得少于 B。

解法:根据最后一个条件,想到格路计数。设 \(f(a,b,c)\) 表示从 \((0,0)\) 开始,走到 \((a,b)\) ,中间停留 \(c\) 次,并且满足不能连续朝同一个方向走两步 的方案数。对于 \(f\) 的计算是简单的,枚举必须被 B 隔开的连续两个 ​A 的个数,然后先往 A 中加入 C ,再加入 B。

考虑根据最后一条限制进行容斥。一般的,我们会计算 \(f(a,b,c)-f(b-1,a+1,c)\) ,但是由于我们通常操作时的“将此后路径翻转”会受到“不能连续朝同一个方向走两步”的限制,所以我们要分情况考虑。首先对于翻转后连续向上走了 2 步的情况,我们可以将其视为只进行了一次向上走从操作,计算 \(f(b-1,a,c)\) 来统计该情况。接着对于向上走后又停一下的情况,我们去掉一个停留的操作,计算 \(f(b-1,a+1,c-1)\) ,发现这里没有计算到停留后又向上走的情况,所以要多计算 \(f(b-1,a,c-1)\)

ABC 392

非常失败。B 题因为着急打错了下标,D 题被卡了精度。E 题没有想清楚实现方法就开始打,最后打得一团糟,WA 了还要重构。下次可以试着倒开避免自己过于着急,罚不该罚的时。

G 题是由于自己在打完 E 题之后不好好思考的结果,总是往奇怪的地方去想,之前已经是做过了一样的题,同一个套路,但是我没有看出来。反映出了我对多项式还不熟,而且自己竟然没有 NTT 的板子。

ABC 392-G

直接设多项式 \(F=\sum[a_j=i]x^i\) ,然后跑 NTT 就可以知道每个和的方案数。

ARC 192

A 题不够谨慎,没有多想 \(n\%4==2\) 的情况的判定条件。B 题思考过程中前后出现了割裂,一开始定义的是 \(s0\)\(a_i-1\) 中偶数的个数,但是后来又把它当成 \(a_i\) 中偶数的个数来做,浪费了大量时间。

ARC 192-C

题意:交互,有一个长度为 \(n(n\le2*10^5)\) 的排列 \(P\) 和一个长度为 \(n\) 的数列 \(a(1\le a_i\le10^9)\) 。现在给定 \(n\) ,每次可以询问两个不相同的数 \(x,y\) ,返回 \(\sum_{min(P_x,P_y)}^{max(P_x,P_y)}a_i\) 。同时排列 \(P\) 满足 \(P_1<P_2\) ,需要在 \(2n\) 次询问以内求出 \(a,P\)

解法:先考虑极端情况,当 \(P_1=1\)\(P_2=n\) 时,我们可以通过询问其他数与极值来得知其他数的大小关系,同时可以通过差分来求出 \(a\) 。转化到一般情况,我们需要求出一个极值,类比树的直径的求法,我们可以通过询问一个数到其他 \(n\) 个数的距离来求出一个极值。这样我们就做完了。但是在求 \(a\) 时有一个细节是 1 与其中一个极值中间 可能没有数,也就是不能用中间的数到两边的距离来算 1 。

ARC 192-D

题意:对于有理数 \(x\) ,定义 \(f(x)\) 表示 \(x\) 的最简分数表示 \(\frac{s1}{s2}\) 中,\(s1*s2\) 的值。现在给定一个长度为 \(n-1(n\le1000)\) 的序列 \(a(a_i\le1000)\) ,定义一个长度为 \(n\) 的序列 \(b\) 是好的,当且仅当 \(\forall i\in[1,n),f(\frac{b_i}{b_i+1})=a_i\)\(gcd(b_1,b_2...b_n)=1\) 。定义一个好序列的价值为 \(\prod_{i=1}^nb_i\) ,需要求出所有好序列的价值之和,对 998244353 取模。

解法:由于与 \(gcd\) 有关,所以考虑从质因数方面入手。不难发现,当我们将 \(a\) 序列的每个质因数分开来求出相应的好序列 \(b\) 的价值之和,再乘起来时,答案即为原答案。于是问题转化成如何对于单个质因子,如何求答案。先处理出每个 \(a_i\) 有多少个质因数 \(p\) ,设为 \(c_i\) ,同时设总和为 \(sum\) ,那么每个 \(f(\frac{b_i}{b_{i+1}})\) 等于 \(b_i\)\(b_{i+1}\) 的指数之差,于是设计DP求答案:设 \(f_{i,x}\) 表示 \(b_i\) 的指数为 \(x\) 时的答案。由于最终结果需要满足存在一个 \(b_i=0\) ,所以多加一维来表示就好了。

ARC 192-E

题意:给定一个 \(n\times m\) 的网格图,其中满足 \(x\in[L,R],y\in[D,U]\)\((x,y)\) 不能走。问从任意的 \(i\in[0,n],j\in[0,n]\) 开始,只向上或向右走,以任意点结束,总共的走法有多少种。

解法:首先我们需要两个强有力的式子:从 \((0,0)\) 走到 \((x,y)\) 范围内的任意一个格子结束的走法为 \(\sum_{i=0}^x\sum_{j=0}^y\binom{i+j}{i}=\binom{x+y+2}{x+1}-1\) ,在 \((0,0)\)\((x,y)\) 范围内,从任意一个格子开始走,走到任意一个格子结束的走法为 \(\sum_{i=0}^x\sum_{j=0}^y\sum_{k=i}^x\sum_{l=j}^y\binom{k-i+l-j}{k-i}=\binom{x+y+4}{x+2}-(x+2)*(y+2)-1\) 。尽管官方使用了数学方法证明,但是在强大的 yangjiaxi 的推导下,我们可以使用更为简便的几何意义来证明:

先证第一个:我们从 \((0,0)\) 开始走,走到 \((x+1,y+1)\) 的方案数为 \(\binom{x+y+2}{x+1}\) ,考虑在这两者之间构建双射。对于一条路径中的最后一个拐点,我们将其连同之后的路径以及到上一个拐点的路径全部删去,就可以得到一条从 \((0,0)\)\((x,y)\) 范围内的一个点的路径。同时由于从 \((0,0)\) 出发,到达 \((x+1,y+1)\) 的路径有两个,所以要 -1。对于第二个同理,通过从 \((-1,-1)\)\((x+1,y+1)\) 的路径进行类似推导即可得到。

有个这两个强有力的式子,我们就可以进行容斥了。先用全部的减去在不能走的范围中的,再减去从哪些地方进入不能走的范围和从哪些地方出来的贡献即可。

ARC194

ARC194-E

题意:给定两个长度为 \(n\) 的 01 串和两个数 \(X,Y\) ,有两种操作,一种是将连续的 \(X\) 个 0 和紧接着的连续的 \(Y\) 个 1 交换位置,另一种是将连续的 \(Y\) 个 1 和紧接着的连续的 \(X\) 个 0 交换位置。问是否能从第一个串转移到第二个串。

解法:考虑将连续的一段 01 压成 A/B ,其中 A 表示原串的 \(X\) 个 0 ,\(B\) 表示原串的 \(Y\) 个 1 。接着我们可以发现,对于新的串,这三对相邻的数是可以转移的 \((0,A),(1,B),(A,B)\) 。考虑将两个串都转化为一个唯一的串,使得这个串相同。于是考虑将每个串都变成某个序最小的串。

先考虑固定 0 和 1,由于它们之间不能交换,所以它们的相对顺序不变。接着考虑确定 \(A,B\) ,对于 \(A\),我们让它一直换到往后的第一个 1,对于 \(B\) ,我们让它一直换到往前的第一个 0。于是我们可以发现,每个串都可以通过这种方法唯一对应到一个串,并且如果两个串相等,那么它们一定可以通过原操作得到。所以我们可以将 \((0,1),(0,B),(A,1)\) 这三对分别取出来,判断它们的相对顺序是否相等就好了。

ARC198

赛前说自己卡 B 了怎么办,结果真的卡 B 了QwQ

ARC198-B

题意:给定三个正整数 \(x,y,z\) ,问是否存在一个满足如下条件的序列 \(A\) ,它由 \(x\) 个 0 ,\(y\) 个 1 ,\(z\) 个 2 组成。

条件:\(A_0=A_{x+y+z},A_{x+y+z+1}=A_1,\forall i\in[1,n],A_i=(A_{i-1}<A_i)+(A_{i+1}<A_i)\)

难点:1、无法读懂题意,一直到问了别人才知道题目所述的不是 \(A_{i-1}\)\(A_{i+1}\) 构成的区间;

​ 2、没有找到合适的思考方法;

​ 3、经典多测但是 return 0

解法:1、加强英语阅读理解能力;

​ 2、对于这种结论题,可以使用打表辅助思考(A题也是,被诈骗了)

​ 3、多注意。。。

ARC198-E

题意:给定正整数 \(n,m(n\le24)\) ,以及 \(m\) 个数 \(s_i\) 。问从 \(x=0\) 开始,每次选择一个数 \(s_i\) ,然后令 \(x=(x|s_i)+1\) ,有多少种选择的方案数使得 \(x\) 在某一时刻等于 \(2^n\)

解法:考虑 DP 。可以设出 \(f_i\) 表示 \(x=i\) 时的方案数,由于直接转移会导致产生一个 +1 的操作,这对于位运算不是很有友好,所以多设一个 \(g_i=f_{i-1}\) 。然后为了更好的优化,我们把枚举 \(s_i\) 变为乘上转移系数 \(a_{s_i}\) ,于是转移式为 \(g_i=\sum_{j|k=i}a_jf_k\) ,容斥一下变成 \(g_i=(\sum_{j\subseteq i}a_j)(\sum_{j\subseteq i}f_j)-\sum_{j\sub i}g_j\) 。于是使用 \(FWT\) 求形如 \(fwt_i=\sum_{j\subseteq i}a_j\) 的式子即可。

ARC199

ARC199-A

题目中有一个特别的限制,\(c_i,r_i<\frac n4\) ,但是一直没想到怎么用。考虑这个条件的含义,即每一行每一个至多有 \(\frac n4\) 个 1 ,转变一下,就是对于每个全部为 0 的行或列,至多对其操作 \(\frac n4\) 次。有了这个就简单了。初始现将第一行变为 0 ,然后由于第一行只能被操作 \(\frac n4\) 次,那么每一列的和不能超过 \(\frac n2\) ,于是列的操作确定了,进而确定了行的操作,最后判断是否可行就好了。

赛时想着去发掘特殊条件是好的,但是没想出来……

ABC409

失误:没有注意到自己做的是 abc G题。

一般 abc G题可以往多项式、网络流方面想。自己的式子已经推出来了,但是没想到如何优化。

ABC409-G

题意:现在有一个可重集 \(A\) ,初始时 \(A\) 中有一个元素 1 。令比 \(A\) 中最大元素还要大 1 的值为 \(m\) ,一共要做 \(n-1\) 次操作,每次有 \(p\) 的概率将 \(m\) 加入 \(A\) ;有 \(1-p\) 的概率随机选择 \(A\) 中的一个数(同一个数算多个),将其复制一个加入 \(A\) 中。对于 \(k\in[1,n]\) ,求出最终序列中 \(k\) 的个数的期望。

解法:考虑如何计算一个数,它会由两个部分贡献来,第一个是从 \(m\) 处加入,这部分用一个组合数算一下就好;第二部分是从已经有的数中选出来,我们将其看作每一个 \(k\) 都有一定概率被选中,那么就相当于上一次的期望个数乘上这个概率。列出式子后化简可以得到递推式:\(f_i=f_{i-1}(1+\frac{1-p}{i-1})+\binom{i-2}{k-2}p^{k-1}(1-p)^{i-k}\)

由于这个式子不好化简,而且我们要求 \(n\)\(k\) ,所以考虑对于每个 \(k\) 的答案的表达式 \(\sum_{i=1}^nf_i=\sum_{i=1}^n\binom{i-2}{k-2}p^{k-1}(1-p)^{i-k}g_i\) ,其中 \(g_i=\prod_{j=i}^{n-1}(1+\frac{1-p}j)\) 。把组合数拆开,将只与 \(k\) 有关的移到外面,可以发现该式子可以用减法卷积来做,写一下就好了。注意特判 \(p=1\)

减法卷积可以通过将下标变换一下实现。

posted @ 2024-02-18 19:28  Cyan_wind  阅读(155)  评论(0)    收藏  举报