10 月做题记录
P7212 [JOISC2020] ジョイッターで友だちをつくろう
维护 SCC 之间的合并即可。
AT_s8pc_5_h Percepts of Atcoder
先建出子序列自动机,然后剖一下,剖成若干棵树,然后倍增即可。
AT_codefestival_2016_final_f Road of the King
我们考察我们一定是每次贡献一些点到 \(1\) 所在 SCC 去,设 \(f_{i,j,k}\) 表示经过 \(i\) 条边,\(1\) 所在 SCC 大小为 \(j\),还走过 \(k\) 个点的方案数。
转移简单。
[ARC149D] Simultaneous Sugoroku
类似于五彩斑斓的世界的套路,考虑每个 merge 两个相反的等价类,复杂度均摊 \(O(n+V)\),也许有 \(\alpha(V)\)?
P7562 [JOISC 2021 Day4] イベント巡り 2 (Event Hopping 2)
贪心考虑这个区间能不能选择,然后连续段分裂,用倍增维护还能放多少个区间。
P6891 [JOISC2020] ビルの飾り付け 4
设 \(f_{i,j,0/1}\) 表示考虑前 \(i\) 个数,选了 \(j\) 次 \(a\),上次选了 \(a/b\) 是否可行。
bitset 优化 \(O(\frac {n^2}w)\),更好的做法是值域定义域互换,然后发现能选的是一段区间。
归纳证明即可。
P7803 [JOI Open 2021] Crossing
先暴力搜出能产生的串,然后一种做法是线段树维护哈希,不香,更好的做法是颜色段均摊即可。
P11160 【MX-X6-T6】機械生命体
Trie 树合并题,以及子树加上 \(v\) 的套路。
P8037 [COCI2015-2016#7] Prokletnik
扫描线+单调栈维护即可。
AT_arc146_d [ARC146D] >=<
把限制变成 如果 \(a_i\ge v_1\),则 \(b_i\ge v_2\) 的形式,这种情况下我们的所有数一定最小。
然后队列维护不合法的限制即可。
CF1641D - Two Arrays
双指针,子集反演统计是否有集合满足即可。
CF938G - Shortest Path Queries
线段树分治,xor 很好,然后不用启发式合并,并查集+按秩合并即可。
对于环我们维护一个线性基即可。
CF1097F - Alex and a TV Show
巨大困难了,无法理解为啥才 *2500
首先 \(1,2,4\) 操作直接 bitset 做完了。
对于 \(3\) 操作,我们考虑构造函数
然后震撼人心的是推一下式子,这个东西变成点乘了,大为震撼。
无法理解为啥会想到构造这个
CF645F - Cowslip Collections
直接莫反。
CF1553G Common Divisor Graph
简单题,优化建图一下然后并查集维护连通性。
CF653G Move by Prime
一般的题,每个质数分开考虑,然后是经典数学问题-中位数。
然后不难发现 mid 的贡献没了,然后枚举每个数,考虑作为 \(-1,1\) 的次数即可。
CF212D Cutting a Fence
建笛卡尔树,然后变成我们高贵的区间加等差数列,差分维护。
这周第二次碰到了。
CF1270G Subset with Zero Sum
令人无法理解的困难内容, \(i\) 向 \(i-a_i\) 连边,则随便找个环即可。
这个构造怎么想到的?????太逆天了。
CF1750F Majority
首先观察是容易的,然后直接 dp 就好了???
我不懂,但是我大为震撼。
设 \(f_{i,j}\) 表示长度为 \(i\) 的段,最后一段 \(1\) 长度为 \(j\),然后二维前缀和优化即可。
CF1325E Ehab's REAL Number Theory Problem
首先排除完全平方因子,然后我们发现每个数的质因数个数不超过 \(2\)。

然后我们将两个质数连边,现在问题变成了无向无权图最小环。
然后我们可以枚举一个起点,BFS 跑生成树,然后枚举不在环上的边计算答案做到 \(O(\frac {V}{\ln V}(\frac {V}{\ln V}+n))\)。
考虑优化,不难发现我们一个环一定经过一个 \(\le \sqrt V\) 的质数,枚举这些即可,复杂度 \(O(\frac {\sqrt V}{\ln V}(\frac {V}{\ln V}+n))\)。
CF1609F Interesting Sections
枚举 popcount,然后扫描线即可,\(O(n\log nV)\)。
CF1736C2 Good Subarrays (Hard Version)
令 \(c_i=\max(i-a_i+1,1)\),则每个 \(r\) 的起点是 \(\max_{i=1}^r c_i\),然后答案就变成了对于所有的这个求和,单侧递归即可。
存在线性做法。
CF1500C Matrix Sorting
很智慧的一个题,先哈希算出两两对应关系,然后考虑每个列排序会带来哪些问题,把不会带来问题的放在最后,然后倒序不断考虑哪些列可以使用,队列维护。
CF1474F
首先仿照划艇的做法,把值域离散化,然后考虑 dp,我们表示在第 \(i\) 个段,填值域 \(j\),的情况 \(f_{i,j}\),然后转移可以组合数计算,时间复杂度 \(O(n^5)\)。
CF1804E
问题等价于我们找一个环,使得所有点和环相邻,状压 dp 即可,时间复杂度 \(\mathcal O(n2^n)\)。
CF1225G
我们不难发现,因为 \(k\nmid a_i\),所以最后每个数的贡献可以写成 \(a_ik^{-b_i}\) 的形式,然后我们状压然后 bitset 优化即可。
CF1188D
先排序,然后不妨假设最后所有数都是 \(x+a_n-a_1\),那么我们就需要 \(\sum popcount(x+a_n-a_1)\) 最小,仔细一看,这不是我们 ARC153D 吗,然后直接做就好了。
复杂度 \(O(n\log V\log n)\)。
CF1408H
线段树模拟最小割。
首先我们考虑怎么建图,首先我们设 \(0\) 的个数是 \(n0\)。
则我们按第 \(\frac {n0}2\) 个 \(0\) 的位置分组,则我们右边的点向右边第一个 \(0\) 连边,左边的点向左边第一个 \(0\) 连边。
然后考虑颜色的限制,我们发现我们只需要对于每种颜色左边最右边的一个和右边最左边的一个连边即可。
然后我们建出来的图是这样的:

由于最大流等于最小割,不难发现,我们只会割 $S\to $ 或者 \(\to T\) 的边,且是一个前缀一个后缀的形式,我们枚举割了多少条前缀,线段树维护每条后缀时的答案即可。
CF1648E
按边权排序,枚举补图边权最大值,然后启发式合并维护有哪些连通块合并,最后在建出来的树上查询最大值即可,复杂度甚至是 \(\mathcal O((n+m)\log n)\)。
CF1085G
设 \(f_{i,j}\) 表示长度为 \(i\) 的排列 \(a\),有 \(j\) 个位置满足 \(a_x\not= x\) 的方案数,不难发现 \(f_{i,i}\) 就是错排数量。
考虑如何转移,枚举最后一个不受限制的数放在哪里:
先枚举前缀相同的长度,对于第一行,康托展开一下,后面的系数是 \(f_{n,n}^{n-1}\)。
然后对于后面的,我们相当于计算后面还有多少个数小于当前位置,以及多少个是不能满足限制的,树状数组维护这些数的个数即可。
CF1712F
奇妙的题目,首先对于问题变成询问 \(\min(X+f_u+f_v,dis(u,v))\) 的最大值。
然后如何计算,我们设 \(dp_{x,i}\) 表示 \(x\) 子树内,\(f_u=i\) 的最大的 \(dep_u\),不难发现这个是单调的,假设现在答案是 \(ans\),枚举 dp 数组大小更小的 \(f_v\),则我们需要满足 \(f_u \ge ans+1-X-f_v\),然后判断这个 dis 是否满足即可。
复杂度 \(O(nq)\)。
CF1477D
人类智慧,根本想不到。
呜呼,无法可想!
首先对于度数为 \(n-1\) 的点,不难发现我们定向之后他的位置就确定了,不妨把这些都扔到最后面。
所以现在就没有度数为 \(n-1\) 的点了。
然后人类智慧出现了:我们从补图考虑。
首先对于一个菊花,那么我们就可以在 P,Q 中分别把根定为 \(1,n\),然后剩下的点分别变成 \(2,3,\ldots n\) 和 \(1,2,\ldots n-1\) 即可,此时我们可以做到所有的 P,Q 不等。
然后我们考虑,如果能把这个补图剖成若干菊花即可。
考虑依次加点,如果新加的这个点连接的所有点中所有点都没有被划分过,那么就可以把这个点和它连接的点划分成一个菊花。
如果有一至少一个点被划分过,我们可以随便找出一个点,设为 \(x\)。
首先,\(x\) 一定不是它所属菊花的根,否则当前点也会被划分到这个菊花。
那么如果这个菊花内有大于 \(2\) 个点,那么就把 \(x\) 从原本的菊花中删了,并和当前点构成一个新的菊花。
如果恰好有 \(2\) 个点,那么可以把那个菊花的根变成 \(x\) ,并把当前点划分到这个菊花内。
AT_arc184_d
转化我们计数的条件,变成计数有多少个集合 \(S\),满足 \(S\) 加上任何一个不属于 \(S\) 的点就会删除一个点,这个可以直接 dp 即可。
AT_arc125_f
首先我们把每个点度数 \(-1\),则我们可以证明此时每种度数和选出的数的个数是连续的,证明略去,然后就可以 \(O(n\sqrt n)\) 背包即可。
AT_agc039_e
很神秘的题,首先枚举 \(1\) 和哪个点相连,设其为 \(k\),然后我们考虑设计 dp 状态,设 \(f_{l,r,k}\) 表示区间 \([l,r]\) 其中 \(k\) 往外面的点 \(K\),有一条边的方案数。
我们枚举和 \((K,k)\) 有交的最大的一条线 \((x,y)\),则我们存在两个点 \(p,q\) 满足 \([l,p]\),\([q,r]\) 是跨过 \((x,y)\) 的,所以就变成了 \(f_{l,p,x},f_{p+1,q-1,k},f_{q,r,y}\),转移即可。
AT_arc068_d
我们首先考虑这个双端队列什么样子,不难发现就是形如这个样子:

然后我们忽略最后 \(n-k\) 个数,有 \(2^{n-k-1}\) 种方法。
所以我们取出来的数列一定可以被划分成不超过 \(2\) 个下降子序列,且第 \(k\) 个数是 \(1\)。
由于 Dilworth 定理,所以我们知道最长上升子序列长度不超过 \(2\),且第 \(k\) 个数是 \(1\)。
我们考虑逆排列,则我们满足相同的规则,我们设 \(f_{i,j}\) 表示长度为 \(i\) 的且第一个数是 \(j\) 的序列个数,则我们考虑转移:
此时我们就可以做到 \(O(n^2)\)。
考虑我们重新写一下转移:
然后我们不难发现这个东西形如从 \((1,1)\) 走到 \((n,k)\),但是不能经过 \(y=x+1\)。
容斥一下得到方案数是:\(\binom {n+k-2}{n-1}-\binom {n+k-2}n\)。
然后就做完了。
1463F - Max Correct Set
首先可以大胆猜测存在一个循环节,然后状压 dp 即可,似乎存在不用状压的做法。
708E - Student's Camp
首先我们可以暴力 dp \(f_{i,l,r}\) 表示第 \(i\) 天,正好剩下 \([l,r]\) 的概率。
然后我们转移可以容斥掉,变成:
然后后面我们可以考虑变成和式,然后我们发现我们也只需要和式,然后就做完了。
908H - New Year and Boolean Bridges
先考虑满足 A 的限制,可以连出若干 DAG,然后此时考虑一下如果不满足 X 的条件就寄了,否则我们至少能定向成为一条链,满足条件。
然后我们考虑最小代价,如果我们要把一个存在 m 个大小 \(\ge 2\) 的SCC,则我们的代价就是 n+m-1,因为首先有一条链,每个 SCC 又至少是一个环,多出一条边,所以代价就是这个了。
在这种情况下,我们只需要最小化大小 \(\ge 2\) 的 SCC 个数,这样的 SCC 只有不超过 \(\frac n 2\) 个,状压 dp 即可,复杂度 \(O(n2^{\frac n 2})\)。
1981F - Turtle and Paths on a Tree
首先考虑 dp,设 \(f_{x,i}\) 表示考虑 \(x\) 子树内的情况,而钦定此时 \(x\) 所在的链的 mex 为 \(i\),且不计算这条链时的最小代价,转移是简单的。
此时复杂度 \(O(nV),V=O(n)\),不能通过,但是放缩一下会知道 \(V\) 只有 \(O(\frac n {\log n})\),具体一下不会超过 \(3863\),然后此时 dp 就可以通过了。
CF1773J Jumbled Trees
CF1427G One Billion Shades of Grey
首先按值域分层,可以证明每层的最优解拼起来就是最后的最优解,然后网络流即可,注意不能暴力建图,要退流才是 \(O(n^3)\) 的。
P7213 [JOISC2020] 最古の遺跡 3
类似于 mex counting 的套路,考虑从后往前做。
然后我们考虑维护 \([i,n]\) 中间 \(c_0\) ,鸽了。

浙公网安备 33010602011771号