ARC (1)
现在开坑,看看一段时间后我能有多大的进步。
- 代码能力:
- 想明白每个维度的上下界,不好做的话,可以尝试改变写法。
- 找不到方向:
- 先观察性质。不好下手处理的题目先进行一些基本的观察,不要上来就做。
*ARC178D
首先我们发现 mex 要从大往小删,并且 mex 能被删掉的条件是,\([0,mex)\) 内的数都在其左侧 / 右侧。
所以可以 dp,扫值域。\(f(i,l,r)\) 表示 \(0\sim i\) 覆盖了给定序列上 \([l,r)\) 的范围。转移分 \(i+1\) 是否在 \(A\) 中讨论。
前缀和优化即可 \(\mathcal O(n^3)\)。
至于为啥要左闭右开,写一写 \([l,r]\) 的写法就知道了 /mgx。
- 代码能力:想明白每个维度的上下界,不好做的话,可以尝试改变写法。
ARC177D
WA 了最后两个点,what can I say?
首先发现,数轴可以分为若干段,段之间互相不影响,可以分开处理。
对于一段,它最终的形态必然是相邻两个分别向两边倒塌,并且覆盖了整个区间。
系数根据单调栈计算,然后线段树 / 扫描线计算即可。
- 先观察性质。不好下手处理的题目先进行一些基本的观察,不要上来就做。
*ARC165E
我似乎还是没有理解这个方法的本质,连续做了这么多题还是不会用,该总结一下了。
“拒绝采样” 应用的条件是,对于随机过程中的随机事件有一定约束,并且概率只和满足约束的元素有关。
我们运用 “拒绝采样” 的核心目的在于,直接将几乎不可做的问题转化为可做很多的问题。
本题符合 “拒绝采样” 的应用条件,我们直接认为,这个过程就是随机一个排列 \(P\),\(x\) 产生贡献的条件就是 \(P\) 中在 \(x\) 前面的点全删掉以后,\(x\) 所在连通块大小仍 \(>K\)。
其实实质上,这个方法直接揭示了贡献计算的方法,套路化地简化了我们的思考。
看完这个我才意识到一个事实:我压根不用管选上前面点对应的概率,只需要关注选上了哪些点,它对我的连通块造成了什么影响就行。
于是 dp。设 \(f(i,j,k)\) 表示 \(i\) 子树连通块大小为 \(j\),去掉了 \(k\) 个直接和连通块相连的点的方案数。
\(\mathcal O(n^4)\),6ms 随便拿下。
ARC160D
我是搞笑哥。
感觉看完题解以后觉得很典,但自己没有想出来,这也说明了一定的问题。
首先我们先进行区间减的操作。
这种过程性强的题目,我们可以直接把操作倒过来,变成区间 \(+1\),单点 \(+K\)。
假设 \([i,i+K-1]\) 做了 \(b_i\) 次区间加操作,我们有结论:合法的 \(a\) 和 \(b\) 形成双射。
其实也比较好理解,\(a\) 到 \(b\) 的映射只需要顺序考虑每个位置就可以简单推出。
然后就是简单计数。
乌鱼了,为啥都发现映射的方式了,就是没发现是双射?
总结一下,这类题目的要点:
- 时光倒流。
- 推性质,找判定条件,猜结论,构造双射。
ARC147D
逆天。
我说,这东西咋做,看起来挺对称啊,那我直接猜 \(n^m\times m\),然后我死了。
考虑将 \(S_i\) 看作一个二进制数,每次就是对其进行一次异或,设 \(S_i\) 和 \(S_{i+1}\) 之间不同的元素是 \(p_i\),那么 \(S_i\) 的状态可以视作 \(S_1\) 和 \(p_1\sim p_{i-1}\) 的异或和。
固定 \(p\),关注单个元素 \(x\),只需关心其是否在 \(S_1\) 中,根据异或的性质,不管是否在 \(S_1\) 中,它出现的次数总和都是 \(n\)。
于是答案就是 \(n^m\) 乘 \(p\) 的不同个数,显然是 \(n^m\times m^{n-1}\)。
不好总结,纯逆天吧。
*ARC104F
什么时候能脱离看题解的悲惨命运呢qwq。
我们很熟悉这个过程,这就是笛卡尔树的构造过程。
而一个笛卡尔树又唯一对应一个数组 \(P\),所以 \(P\) 和笛卡尔树的形态形成双射。
于是枚举区间最值后区间 dp 即可。
变换视角,造双射,找子结构,dp。
AT_cf16_final_f
并不是 ARC,但是计数 suki。
强连通图的分步构建,考虑 ear-decomposition 的 pattern,我们只关注 \(1\) 所在强连通分量的大小和当前正在构建的强连通分量。
设 \(f(i,j,k)\) 表示走了 \(i\) 次,\(i\) 所在强连通分量大小为 \(j\),当前走到了 \(k\) 个还没加入强连通分量的点。
转移随便转一下吧。\(O(n^3)\)。
哎呦又把 \(10^9+7\) 写成 \(998244353\) 调一年,这么喜欢多项式的?
*ARC160F
感觉是很好的题目,找到合适的刻画方法后就行云流水。然而我对 01 转化仍然不熟悉,该好好看看了。
排序的刻画:
- 逆序对。
- 拓扑序。
- 01 序列转化。
涉及排序且信息繁多不好维护的情况下,我们一般会考虑 01 序列转化,再考虑 01 序列和原序列之间的对应关系。
本题中,将 \(\le x\) 的设为 \(0\),\(>x\) 的设为 \(1\),一个 \(01\) 序列的合法性判定是简单的。
知道了什么样的路径是合法的后,简单地进行路径计数。
然而 \(m\) 很大,不过真正的非平凡 \((a,b)\) 只有 \(O(n^2)\) 对,拿出来处理一下即可。
时间复杂度 \(O(n^32^n)\)。
然而还是看题解了,下次尽量别看吧。
ARC146C
异或线性基的处理手法,见过多少次了怎么还是不会。
先回顾一下在 \(\{0,1,\dots,2^n - 1\}\) 中选大小为 \(k\) 的线性无关组的方案数:假设当前要选 \(i+1\) 个,前面 \(i\) 个张成的空间大小为 \(2^i\),那么方案数是 \(2^n-2^i\),于是答案就是 \(\prod\limits_{i=1}^k (2^n-2^{i-1})\),然而无序,除一个 \(k!\)。
性质:大小为偶数的集合之间,对称差大小亦为偶数。
于是大小为偶数的集合所张成的空间构成了原线性空间的一个子空间。随便构造一个 \(\{a_1\oplus a_2, a_1\oplus a_3,\dots, a_1\oplus a_{n+1}\}\) 就能表示。
考察这样的集合的选取方案,第一个随便选,\(2^n\),而对于 \(i>1\) 的部分,前面只有 \(i-2\) 个线性无关向量,于是张成的空间大小为 \(2^{i-2}\),答案为 \(\sum\limits_{k=0}^{n+1} \frac{1}{k!}\prod\limits_{i=1}^n f_i\)。
又看题解。
*ARC144D
牛魔,好不容易做出了一些自己的思考,后面的标准处理手法又不会。byd 怎么这么菜。
不是很懂,这个东西真的是能直接猜出来的吗,太空步了。
面对一个完全陌生且逆天的东西,what should I do?
直接做没有办法找到什么性质,我们尝试动用一些常规手段来进行剖析。
考虑增量构造,每次新考虑一位 \(d\),显然 \([2^d, 2^{d+1}-1]\) 之间的部分是可以独立考虑的,我们考虑 \([0,2^d-1]\) 和它的关系。也就是 \(a_i+a_{j+2^d}=a_{i\&j}+a_{i|j+2^d}\),我们发现有 \(a_{j+2^d}-a_{i|j+2^d}=a_j-a_{i|j}\),再泛化一下既有 \(a_{j+d}-a_{i+d} = a_{j}-a_i\),于是差分相同。
然后我们又发现,只需要考虑拼接处的差分,剩下的部分直接就满足了所有限制。太有趣了。
然后考虑 dp。我们只需要关注当前构建出的序列的极差。后面我就不会了。
设 \(f_{d,x}\) 表示当前考虑前 \(d\) 位,极差为 \(x\) 的方案数。转移 \(f_{d+1,x+i}\gets f_{d,x}\times (1+[i>0])\)。
显然我们只关心 \([i>0]\) 这个系数的贡献,事实上是好算的,我们有:
把 \((k-i+1)\) 拆成 \((k+1)\) 和 \((-i)\),交换求和顺序,然后上指标求和随便化一下就好。这个感觉方法很多,本身形式并不是特别复杂。
时间复杂度 \(\mathcal O(n)\)。
变换视角,标准处理。
ARC089F
感觉很 AGC style 而不 ARC 的题,就是一步步拆解吧。
哦我是沙伯,这题并不简单啊。结构一层套一层,好烦。
我错了,先不写这题了呜呜。
*ARC132E
?
没看出来最终答案的形态是固定的,感觉是观察的方法有一点问题。
首先我们考虑时光倒流,对着第二个样例手摸一下,容易发现最终答案的形态肯定是 <<<<<====>>>>>
这样的东西。
然后考虑划分阶段。我们并不需要考虑具体操作了哪一个,因为我们有着明确的构造目标:也就是上面的那个形态。
因此,我们可以这样涉及状态:\(f_n\) 表示 \(n\) 个点全都向左,且最终不影响到右边的方案数。
发现影响到右边的唯一情况就是第 \(n\) 个点选了向右,去除这种情况以后子结构递推下去就好了。\(f_n=f_{n-1}(1-\frac{1}{2n})\)。
然后算下答案就行,枚举间隔。
所以在观察出一些东西前,觉得不可做的话,还是回去看看手摸出来的东西具有怎样的形态。
ARC104E
一看就感觉是个造双射题,然而好像并不是。
对于一个方案,我们显然只需要知道元素间的偏序关系,因为 \(N=6\) 所以很少。
对于每种偏序关系,算出来它的 LIS,再乘上方案数即可。
方案数就是 [APIO2016] 划艇,dp 一下就行。但是拉格朗日插值怎么写?
时间复杂度不知道,反正感觉随便过吧。不推荐,太shaber。
ARC106D
都已经做过多少题了还不熟悉和式的处理,真是shab了。
首先 \(\sum\limits_{i=1}^{n-1}\sum\limits_{j=i+1}^n a_i\) 我们可以拆成 \(((\sum\limits_{i=1}^n a_i)^2-\sum\limits_{i=1}^n a_i^2)/2\),这样的好处是式子非常对称,于是有了很好的性质。
然后这个题就做完了,二项式定理拆一拆然后改变求和顺序即可。\(\mathcal O(nk)\)。
**ARC106E
终于淘出来了一道 Educational 题。
似乎比较 nb 的话也可以直接看出来这个结论,不需要形式化推导。
尝试从周期角度直接贪心之类的做法无果,我们考虑使用网络流。
首先二分答案,将每个人拆成 \(K\) 个点,向来了的那些天连边,然后跑网络流 / 最大匹配即可。
注意到这个题是要求完美匹配,于是我们考虑 Hall 定理。
Hall 定理使用的时候需要注意的是关注哪一侧的点,我不太清楚有没有好的决策方法,我反正是左右两边都试试。
对于右侧点(每天对应的点),左侧点的状态可以简单求出,设为 \(S_i\)。那么最终左侧点的状态是若干 \(S\) 的并。
再换个视角,对于左侧点固定状态,我们希望右侧点取的尽量多,这样限制更严。那么对着 \(S\) 做一个高维前缀和再 check 一下即可。时间复杂度 \(\mathcal O(n2^n\log K)\)。
很厉害的题。我自己做的时候直接被第一步卡住了,后面的每一步反而都比较行云流水。然而这个是有一些东西可以总结的,我们发现周期性的结构进行最优化,直接做其实还是挺不容易的。
所以任何时候,最优化问题上卡壳,最直接的解决方法就是考虑网络流。
当然这题也有一些表面化的做法,比如直接猜结论之类。不过感受到这种东西可能也离 Hall 定理不远了。
upd:写完代码发现还有一个细节:[HAOI2015] 按位或 里面的正难则反技巧。
ARC106F
基础 Prufer 序列练习题。
但是我一开始式子列错了,导致后面咋化都做不出来,南瓜。
但这个推式子感觉,不是特别难。大概就画一画,凑一个多元范德蒙德卷积。
ARC107D
我真蒙古了啊,我的做法为啥过不去。
我认为直接做可以有一个 \(\mathcal O(nk\log k)\) 的 dp,然而它是错的,无语。
我们这样来考虑转化这个过程:每次选上 \(1\),或者给已经选上的数乘上 \(\frac{1}{2}\)。
不难发现这样一定正确。和拆分数的 \(n\sqrt n\) 其实很类似。
然后考虑 dp。设 \(dp_{i,j}\) 表示前 \(i\) 个数填出来 \(j\) 的方案数。
转移就是 \(dp_{i,j}\gets dp_{i-1,j-1}+dp_{i,j\times 2}\)。
所以做出来的关键就在于,怎样看待这个过程。
可能可以看作 “最终局面” 的逆向思路,过程性问题可以导向最终局面,而对于最终局面,我们也可以尝试改变其构造过程,从而简化我们的 dp。
ARC107E
纯纯的shaber题。没有任何意思。
试了试各种方法都不行,那感觉只能是有周期了呗。
*ARC107F
完全不会一点 flow,所以照着自己的理解给个胡扯:
flow 的一个 trick:转换贡献形式。唉是不是所有最优化题都可以这样来着。
我们发现最难受的是绝对值,如果能去掉就好了,我们知道 \(\max(a,b)-\min(a,b)=|a-b|\),那么设 \(S^+=\sum_{i\in S} [b_i>0]b_i,S^-=\sum_{i\in S}[b_i<0]-b_i\),那么 \(|S^+-S^-|=\max(S^+,S^-)-\min(S^+,S^-)=S^++S^--2\min(S^+,S^-)\)。
建图,拆出入点 \((u,u')\),中间连边 \(a_u+|b_u|\),对于边 \((u,v)\) 连 \((u',v),(v',u)\),都是 \(+\infty\)。
然后考虑描述连通块。对于 \(b_u>0\) 连 \(S\to u\),对于 \(b_u<0\) 连 \(u'\to T\)。边权都是 \(2|b_u|\)。
然后你发现这样它不可能同时割两边,于是就能描述 \(2\min(S^+,S^-)\) 了。