6月杂题选做

上回说到:2022.5 part 2

关于难度

\(\color{gray}\bigstar\) 可以秒杀的题。

\(\color{green}\bigstar\) 思考一会儿后可以秒的题。

\(\color{blue}\bigstar\) 需要较长时间思考的题。

\(\color{Gold}\bigstar\) 看题解、稍加指点就会做的题。

\(\color{red}\bigstar\) 看题解后需要较长时间消化,甚至现在都没有完全理解的题。


ARC121E *2645 \(\color{green}\bigstar\)

已知一棵 \(n\) 个点的树,求有多少个排列 \(a\),满足对于每个 \(i\)\(a_i\) 不是 \(i\) 的祖先(不包括自己),答案对 \(998244353\) 取模。

\(n\le 2000\)

标签:树形背包。

其实不是很难的题。

考虑 \(a_i\) 不是祖先比较困难,所以考虑 \(a\) 的逆排列 \(a'\),那么也就是 \(a'_i\) 不能是 \(i\) 的子树中的点(除 \(i\) 外)。

考虑会有很多位置不合法,所以可以直接容斥,设 \(f_{i,j}\) 表示 \(i\) 子树中有 \(j\) 个不合法的点的方案数。

那么直接树形背包转移,然后最后直接统计即可。

code


ARC058E *2473 \(\color{gray}\bigstar\)

题比较长,自己看。

标签:状压dp。

\(X+Y+Z\le 17\),显然状压,设 \(f_{i,S}\) 表示前 \(i\) 个填完,所有后缀集合为 \(S\) 的方案,然后把 \(>17\) 的位扔掉,直接转移即可。

code


打了 ABC 254,过了 ABCDEFEx。

开局秒E,然后过了F,G没人过先去Ex,看错题写好久,过了之后看了一下G,发现是阿拉丁题,狗都不写。


ABC254Ex *2499 \(\color{blue}\bigstar\)

有两个集合 \(a,b\),每次操作选择 \(a\) 中一个数乘 \(2\) 或者除以 \(2\) 下取整,问最少操作几次后 \(a=b\)

\(n\le 10^5,a_i,b_i\le 10^9\)

标签:字典树,贪心。

考虑操作过程本质上是二进制为删末尾和加 \(0\),那么考虑 \(x\) 变成 \(y\),要么无解,要么次数就是两者长度之和减去 LCP 的两倍。

所以贪心,先放字典树上,然后把字典树一个节点内的进行匹配,然后统计即可,无解就是一个节点内 \(b\) 中数数量大于 \(a\)

事实上,用 map 实现更加简单。

code


cf2017finalE *2817 \(\color{blue}\bigstar\)

有一个长度为 \(n\) 的字符串,有 \(m\) 种操作,每种操作把 \([l_i,r_i]\) 区间种所有字符加一,(z 变成 a),问是否可以把字符串变成回文串。

\(n\le 10^5\)

标签:并查集。

考虑区间加显然直接差分,这样变成了一个加一,一个减一,目标状态依然是回文。

考虑回文不好搞,因此增加 \([i,n-i+1]\) 这个操作,那么就相当于全部相等。

可以发现连边后连通块和不变,直接判断即可。

code


ARC064F *2949 \(\color{green} \bigstar\)

已知两个数 \(n,k\),把所有长度为 \(n\),值域为 \([1,k]\),的回文串以及它的所有循环移位的结果放入一个集合 \(S\),求集合大小对 \(10^9+7\) 取模的结果。

\(n,k\le 10^9\)

标签:计数。

先考虑对于一个串对答案的贡献。

考虑如果会重复,那么必然存在一个周期,又因为整体是一个回文串,所以每个周期都是一个回文串。

\(s_i\) 表示周期长度为 \(i\) 的回文串个数,这个可以直接容斥。

然后直接统计答案即可,需要注意如果 \(i\) 为偶数需要除以二,因为 \(Arev(A)\)\(rev(A)A\) 会重复统计。

code


ARC065F *2652 \(\color{Gold} \bigstar\)

有一个长度为 \(n\) 的 01 序列,顺次进行 \(m\) 个操作,每次操作把 \([l_i,r_i]\) 中的元素任意排列,问操作后有多少种可能的序列对 \(10^9+7\) 取模。

\(n,m\le 3000,l_i\le l_{i+1}\)

标签:dp。

考虑设 \(f_{i,j}\) 表示从左到右确定了第 \(i\) 个了,从 \(i\) 到它可以操作的最右边还有 \(j\)\(1\) 的方案。

直接考虑 \(i\) 变为 \(i+1\) 时多出的 \(1\) 的数量转移即可。

code


AGC028C *2463 \(\color{blue}\bigstar\)

\(n\) 个点 \((a_i,b_i)\)\(i\)\(j\) 的距离为 \(\min(a_i,b_j)\),求最小哈密顿回路。

\(n\le 10^9\)

标签:贪心。

考虑 \(a_i\)\(b_i\) 连边,把所有值一起排序,那么最小答案一定是前 \(n\) 个数之和。

边就有三种,左到右,右到左,左到左或者右到右,如果可以形成一个每次都是左右交替的环就是最优的。

如果有第三类显然可以产生这样的环。

只有第一类或者只有第二类也可以。

否则,可以交换左右的一个数,使得存在第三类即可,或者可能全部选 \(a\) 或者全部选 \(b\)

code


ARC101F *2930 \(\color{Gold}\bigstar\)

一条数轴上有 \(n\) 个机器人和 \(m\) 个出口,机器人和出口重合时就会离开,现在可以操作机器人一起向左移动一格或者一起向右移动一格,记录序列 \(a\)\(a_i\) 表示第 \(i\) 个机器人最以后从哪个出口离开,求有多少个不同的 \(a\)

\(n\le 10^5\)

标签:dp,计数。

显然,每个机器人只会从左边或者右边第一个出口离开,也就是会有两个值 \(x,y\) 表示左边和右边的距离。

放在平面直角坐标系上,对应很多点。

考虑横坐标是当前移动向左的最大值,纵坐标是向右最大值。

那么就相当于对于每个点,要么从它左边走,要么从下面走。

选择一些点,表示这些点从左边走,对呀唯一一条路径,也就是可以向右就向右,否则向上,

因此设 \(f_i\) 表示走到第 \(i\) 个点的方案,\((0,0)\) 也是一个点。

那么

\[f_i=\sum_{x_j<x_i,y_j<y_i}f_j \]

直接树状数组维护即可。

code


ARC100F *3486 \(\color{Gold}\bigstar\)

题比较长,自己看。

标签:计数,dp。

考虑一个问题:长度为 \(n\) 的序列不含有一个子串是长度为 \(m\) 的排列的个数咋做。

这个直接dp,设 \(f_{i,j}\) 表示到了 \(i\),后缀最长互不相同的最大长度为 \(j\),转移方程为:

\[f_{i,j}=\sum_{k=j-1}^{m-1}f_{i-1,k} \]

这个可以前缀和优化。

那么本题直接按序列 \(a\) 讨论。

  • 如果 \(a\) 长度大于 \(m\),如果含有一个排列了,那么直接左右乱填,否则相当于前缀一个dp,后缀一个dp,合并即可。
  • 如果小于,如果有两个相同,和上面一样,否则考虑用两个数组 dp,一个正常做上面的东西,领一个统计含有的方案数。

code


ARC099F *3039 \(\color{Gold}\bigstar\)

有一个序列,初始都是 \(0\),一个指针,初始指向 \(1\),一个长度为 \(n\) 的操作序列,< 表示指针左移,> 表示右移,+ 表示对应位置加一,- 表示减一。

问有多少个区间满足使用这个区间操作后得到的序列和整个操作序列操作后结果相同。

\(n\le 2\times 10^5\)

标签:哈希。

好题,没想到。

直接哈希最后的序列,然后就可以直接用 map 统计了。

需要使用双哈希。

code


ARC097F *2948 \(\color{blue}\bigstar\)

有一棵 \(n\) 个点的树,有一个人站在一个节点上,节点有黑白颜色,每秒可以走向相邻节点并更改那个节点的颜色,或者更改当前节点颜色,求把所有点变成黑色所需最小时间。

\(n\le 10^5\)

考虑如果一个子树中的点全是黑,那么这个子树显然可以扔掉。

剩下的树上每一个点显然至少经过一次,

先假设起点终点一样,那么考虑答案怎么算,先全部点走一遍,然后再把白点数量加上即可。

考虑起点终点不一样,那么相当于一条链上次数减一,显然黑点贡献为 \(2\),白点贡献为 \(0\),直接找直径即可。

code


ARC093F *3201 \(\color{blue} \bigstar\)

\(2^n\) 个人打淘汰赛,你是 \(1\) 号,对于 \(1<i<j\)\(i,j\) 号选手,\(i\) 可以打败 \(j\),已知一个大小威 \(m\) 的集合 \(a\),这个集合中的人可以打败 \(1\) 号,其他的都会被 \(1\) 号打败,问有多少种安排开始顺序使得 \(1\) 最后获胜。

\(n,m\le 16\)

考虑 \(1\) 会和 \(n\) 个人打,其中有一个满足在集合 \(a\) 中就寄,考虑容斥一下,这 \(n\) 个要打的人第 \(i\) 个人是先打败了 \(2^{i-1}\) 个人再和 \(1\) 打的,因此状压一下,背包,从大到小放入,记录一下当前已经放了的集合,这样可以计算前面放的对后面的贡献。

时间复杂度 \(O(n^22^n)\)

code


打了 ABC255 ,Ex 思博题,但是G最后没调出来。


ABC255G *2734 \(\color{green}\bigstar\)

\(n\) 堆石子,双人玩 nim 游戏,有 \(m\) 条限制,如果一堆石子当前有 \(x_i\) 个,就不能在这堆石子中选 \(y_i\) 个。问先手是否必胜。

\(n,m\le 2\times 10^5\)

考虑直接算 SG,求 mex 的过程本质上就是前面所有的点扣掉几个,容易发现前面必然满足 \([1,t]\) 都出现一次,然后还有一些点多出现几次,那么直接开桶即可计算,赛时调不出来是大失败,不过写完其他题这题也只剩 \(20\) 分钟不到了。

code


AGC023D *3173 \(\color{Gold}\bigstar\)

数轴上有 \(n\) 个点,每个点住 \(a_i\) 个人,一开始有一辆车坐着所有的人,每个时刻进行投票向左还是向右走,向票数多的方向走一格,每个人都想让自己先到家,下车不需要时间,走一格需要一秒,求所有人到家所需时间。

不会,看题解。

考虑正难则反,考虑最后到的一定是最左边或者最右边的哪一个点,考虑那边人少最后就到那里去,然后向中间缩一格,那么人少的那一边一定会优先投票给人多的那一边,然后一直比较,缩小即可。

code


打了 ARC142 过了 ABC,D是阴间数数不会,但是D过的人很少所以上分力。


ARC142D *2938 \(\color{Gold}\bigstar\)

题比较长,自己看吧。

考虑这样一个问题,如果 A 状态可以变成 B,B 状态可以变成 C,由于变化一定是双向的,所以这样一定不合法,所以最后的方案一定是两两对应的。

\(1\) 为选,\(0\) 为不选,先考虑链的情况,可以发现一定是 \(1111\dots 10\) 或者 \(01111\dots1\) 的形式。

所以可以把树分成这样的链,可以发现树形 dp 是有下面一些情况:

  • 是一条链的 LCA
  • 不是一条链的 LCA,\(0\) 的一端是它的儿子。
  • \(1\) 是它的儿子。
  • 是LCA,并且是一端,那么就有 \(01\) 两种情况。

以此 dp,考虑有一些特殊情况无法满足即可。

code


ABC219F *2542 \(\color{blue}\bigstar\)

有一个波特,给一个行走序列,对着这个序列走 \(k\) 轮,问会经过多少个不同的格子。

\(n\le 2\times 10^5,k\le 10^{12}\)

实现题,WA 吐了。

考虑会有很多点重复,那么就容斥一下,考虑那些点会重复,假设走完一轮后到达了 \((x,y)\),那么 \((a,b)\) 会和 \((a+x,b+y)\) 重复,这样会形成一条条边,然后上面跑容斥即可。

code


AGC012D *2760 \(\color{green}\bigstar\)

\(n\) 个球,每个球有颜色和权值,排成一行,每次可以交换两个球。

  • 如果两个球颜色相同,则两球权值需要不超过 \(X\)
  • 如果两个球颜色不同,则两球权值需要不超过 \(Y\)

求有多少种可能的球序列,答案对 \(10^9+7\) 取模。

\(n\le 10^5\)

简单题,不知道为啥评分这么高。

考虑两个球可以操作就连边,这样考虑每个连通块都可以乱放,所以可以直接计算,但复杂度 \(O(n^2)\)

考虑相同颜色的球,由于只需要联通,所以直接链权值最小的即可。

不同的也一样,找最小的即可。

code


AGC043C *2872 \(\color{red}\bigstar\)

题比较长,自己看吧。

神题,不知道为什么会有人可以想到。

考虑这个三个图很勾八,没有什么算法可以搞,因此考虑用 SG 函数(这步巨难想)。

因为显然是从大到小取,因此对每个图跑一遍 SG,然后相当于异或和等于 \(0\) 的点之和。

SG 最大值是 \(\sqrt{n}\) 级别的,暴力即可。

code


ABC214G *2893 \(\color{blue} \bigstar\)

求有多少个排列 \(p\),满足对于所有 \(1\le i\le n\) 满足 \(p_i\ne a_i,p_i\ne b_i\)

\(a,b\) 都是排列。

\(n\le 3000\)

不错的题,模拟赛出了 \(2\times 10^5\) 的。

错排问题考虑容斥,假设有一些数不合法,可以发现不不合法是在 \(a_i,b_i\) 里面选一个,容易想到连边,然后变成置换环问题,容斥计算相当于每个置换环合并。

考虑一个大小为 \(m\) 的环中选 \(x\) 个不合法的,考虑把边也建个点,相当于连 \(x\) 条不联通的边,那么由于是个环,直接断环,分类断环处的边是否选即可,答案就是

\[\binom{2m-x}{x}-\binom{2m-i-1}{i-1} \]

合并就是直接卷积合并,用分治 NTT 即可。

code(NTT),会 WA。

code (暴力卷积)。


打了 ARC143,过了ABCDE,起飞了,perf 2k6+。

阴间场,B 卡了一会儿,对心态有点打击,C诈骗,先跳了,D一眼秒,在震惊的时候写完代码一交 TM 乱猜结论过了,感觉直接起飞,然后 C 想半天,发现是 sb 题,看 E 只剩 \(20\) 分钟了,Kobe 锐评我做不出来了,结果 \(5\) 分钟秒了。。。F 是问号题,全场没人过。

感觉时间主要浪费在 C,不知道这种寄吧博弈论为啥要想这么久,还一发罚时,B 也点小失误,其他题的表现还不错。


ARC143B *1433 \(\color{green}\bigstar\)

有一个 \(n\times n\) 的矩阵,向里面填 \(1\)\(n^2\) 的排列,如果存在一个数满足是一行的最小值又是一列的最大值那么不合法,求合法矩形数量。

\(n\le 500\)

其实题目还是不错的,诈骗。

一开始一直想容斥,想半天后发现一个有趣的结论:不合法的点最多一个。

证明很简单,考虑有两个点 \(a,b(a<b)\) 都不合法,\(b\) 既然是一行的最小值,那么其他数一定都大于 \(a\),那么 \(a\) 显然合法了。

所以直接枚举不合法的数然后直接算就好了。

code


ARC143C *1805 \(\color{blue}\bigstar\)

\(n\) 堆石子,第 \(i\) 堆有 \(a_i\) 个,两人博弈,A 每次选若干堆然后每堆拿 \(X\) 个,B每次选若干堆拿 \(Y\) 个,不能操作者输,求先手是否必胜。

\(n\le 2\times 10^5\)

诈骗题,一开始考虑 \(X=Y\) ,可以发现是柱状图转一下然后跑 nim ,但感觉和正解一点关系都没有。

考虑策略最优一定是模仿对方出招,对方选什么我就选什么,相当于所有堆都去模 \(X+Y\) 然后分讨即可。

code


ARC143D *2229 \(\color{green}\bigstar\)

题目比较长,自己看吧。

考虑一个双联通分量是咋样的,对应到 \(m\) 条边上必然就是一个环,而且是有向的,容易发现连出来一个强联通分量就对应了一个双联通分量。

原题转化为:已知一个无向图,给每条边定向使得强联通分量个数最小。

直接 \(dfs\) 树,树边向下,返祖边向上显然最优。

code


ARC143E *2521 \(\color{green}\bigstar\)

\(n\) 个点的树,点有黑白二色,每次选一个黑点删掉,然后与之相连的点都反转,求操作序列使得删除所有点,要求字典序最小。

\(n\le 2\times 10^5\)

考虑每次删除一个叶子,如果是黑色那么显然直接删,因为先操作父亲就寄了,否则一定先操作父亲。

这样就可以判断是否合法了,接下来构造,建出每个点和父亲的先后关系,直接拓扑即可。

code


posted @ 2022-06-21 08:20  houzhiyuan  阅读(123)  评论(0编辑  收藏  举报