板刷ARC 精选
前言
目前板刷进度:\(\texttt{ARC058}\to \texttt{ARC083}\),但是 \(\texttt{ARC070}\) 之前的一些题解还没补。
可能会有一些后面打的的补题。
没有总结还是不行的,写一些有意义的和看了题解的题目。
\(\texttt{ARC075F}\)
做不起蓝题,笑死。
考虑去分析一下:对于 \(N=\overline {abcd}\),发现 \(\text{rev}(N)-N=(d-a)\times 999+(c - b)\times 90\)。
再写一些位数多一点的,发现这些系数就是 \(9999999, 999990, 99900, 9000\)。
且可以发现相邻两个系数数量级差距很大,是没有办法被弥补回来的。
至于 \((d-a),(c-b)\) 这些系数的值,可以发现要么是一种负数,要么是一种整数,也就是说最多只有两种。
然后再求下方案数即可,时间复杂度 \(\mathcal{O}(2^L)\),其中 \(L\) 是输入的数的位数。
\(\texttt{ARC076F}\)
很经典的题目。
之前直接看贪心题解跑路了,这里写一下严谨的扩展 \(\text{Hall}\) 定理做法。
可以直接转化为二分图模型,由扩展霍尔定理,本题相当于求解 \(\max_{S\subseteq V_L} \{|S|-|\bigcup _{v\in S}N(v)|\}\)。
发现这个邻域是两个区间,不好处理,考虑把并转化为转化为 \(m\) 减去补集的交集,然后写一下式子,枚举交集 \(l_i\) 的端点位置,然后扫描线应该就行了。
\(\texttt{ARC079F}\)
其实应该是会的,但是手贱点开了讨论区去看了一眼做法。
首先应该是一颗外向基环树,对于链上的点,应该对应的 \(a_i\) 都是确定的。问题在于环上如何构造。
发现对于环上的一个点,他无论如何都只有可能是三种取值(一种是只考虑链上儿子的,还有一种就是他在环上的后继节点把前一种取值给占了,最后一种就是前驱和后继都给占掉了)那你直接随便找一个点,枚举这三种取值,然后在环上的其他任意一个节点在枚举了的情况下对应的取值都是确定的,最后判一下合法即可。
时间复杂度 \(\mathcal{O}(n)\),主要是要记住合法取值不会很多且确定了就可以一一对应这个点。
\(\texttt{ARC080F}\)
这个题就有点聪明了。
首先,看到区间操作就给我想差分,看到区间操作就给我想差分,看到区间操作就给我想差分!
现在相当于是将原数组的异或差分数组(即 \(a'_i=a_i\oplus a_{i+1}\))经过最少的操作次数将其全变成 \(0\)。一次操作相当于找到两个位置 \(x,y\),满足 \(y-x\) 是质数,并对 \(a'_x=a_x\oplus 1,a'_y=a_y\oplus 1\)。
发现差分数组中 \(1\) 的个数是偶数,自然想到将他们两两配对然后通过操作去删除。
比如将 \(x,y\) 配对,那么我们只要算出 \(y-x\) 能被最少多少个质数加起来得到,当作边权,相当于找到一般图的最小带权匹配。
发现不是很可做,故选择从边权的特殊性进行破题。
观察到如果 \(y-x\) 是一个奇质数,那么 \((x,y)\) 的边权就是 \(1\)。如果是一个偶数,那么由歌德巴赫猜想(最蚌埠住的一集),显然它的边权就是 \(2\),如果是奇数但不是质数,那么由偶数的边权,它的边权就是 \(3\)。(其实在比赛中,发现这个东西的唯一办法只有打表,除非你脑子构造比较奇特。)
发现尽可能多的使用边权为 \(1\) 的进行匹配一定不劣,然后剩下的尽可能用 \(2\),用不了的就是 \(3\)。发现边权为 \(1\) 的匹配可以看作是分成奇数和偶数两半的二分图最大匹配,剩下的匹配不了的同侧点就用 \(2\),最后最多只会剩下异侧的两个点(注意到总点数一定是偶数,故不可能会单出),连 \(3\) 即可。
官方好像把匈牙利卡了,那就使用 \(\text{Dinic}\),时间复杂度 \(\mathcal{O}(n^3)\)。
\(\texttt{ARC081F}\)
考虑合法矩阵所含的性质,我们发现对于每一个 \(2\times 2\) 的矩阵其所含 \(1\) 的个数必然是偶数。因为上下两行必然相同或相反。
我们又发现,如果一个矩阵其所含的每一个 \(2\times 2\) 的矩阵都合法的话,这个矩阵满足上述性质,也就是说其必然合法。
然后我们只要以每个 \(2\times 2\) 的矩阵的合法状态构建一个新矩形,然后求其最大全 \(1\) 子矩形即可。这个有 \(\mathcal{O}(n^2)\) 经典做法。
注意,一行或一列的矩形必然合法。
告诉我们的是,以小见大。
\(\texttt{ARC082E}\)
很好的题目,启示我们遇到看起来不舒服的式子,可以想想组合意义。
发现 \(2^{n-|S|}\) 这种贡献非常奇怪,考虑其组合意义。
发现就是在不改变凸包的情况下对它包含的所有点选择取或不取的方案数。
其实就是所有,满足里面的点不都共线的集合。
反过来说就是 \(2^n\) 减去满足里面的点在一条线上的集合数量。
考虑去枚举线段的两个端点,求出这条线段上有多少个点,答案就是 \(\text{ans}-2^{\text{cnt}}\)。
还是很具有启发意义的。
\(\texttt{ARC082F}\)
学会整体处理是一件非常重要的事情。
考虑把询问离线下来然后整体做。
有一个很重要的性质是无论你怎么操作,排完序之后,能不能把 \(T_i\) 流完,他们剩下的沙子都是有序的。
相当于是除了全局修改之外,我们一直在进行的是前缀和后缀的修改。
然后随便打颗数据结构应该就可以做了。
\(\texttt{ARC083E}\)
完了,2300- 的题又不会了,想退役了。
首先应当有一个 \(\mathcal{O}(n\times V^2)\) 的暴力 DP,每个节点储存一下自己染成白色还是黑色的 \(0/1\),再储存与自己颜色不同的点的权值之和。
看起来没有什么优化空间啊。
我们发现,我们似乎只需要尽可能的让与自己颜色不同的点的权值越少,然后自己这一位上多补一点就可以满足要求。
故考虑定义 \(dp_{i,0/1}\) 表示将 \(i\) 染成黑/白色,子树内与自己颜色不同的点的权值之和最小是多少。
直接转移貌似有些困难,考虑每一个节点开一个辅助的 \(f_{v,0/1}\) 表示当前节点,染成 \(0/1\) 的和为 \(v\),颜色为 \(1/0\) 的点的最小权值是多少。
发现这个是非常好转移的,然后将 \(f\) 的信息合并到 \(dp\) 上即可。
时间复杂度 \(\mathcal{O}(n^2)\)。
注意 0/1 问题可以通过刻画一些连续区间 \(1\) 的左右端点来实现复杂度的降低。

浙公网安备 33010602011771号