11月记录
470.CF10E
不是很懂的题。
妙妙妙题!!!
调整归纳好!!
记钱 x 的贪心表示为 G(x),最小表示法为 M(x),那么始终有 G(x)≥M(x)。
我们要求最小的 w,满足 G(w)>M(w)。
G(x) 的子集也是贪心表示,M(x) 的子集也是最小表示,考虑反证。
由此,因为 w 最小,所以 G(w),M(w) 非零位无交,否则可以更小。
设 i,j 为 M(w) 的最小最大非零位,严格降序。
结论:G(ai−1−1) 和 M(w) 的 1,⋯,j−1 位相同,第 j 位小一。
证明:
G(w) 在 1∼i−1 维一定有非零的,否则因为非零位无交,G(w) 第 i 维为零,因为 M(w) 第 i 维非零,故 w≥ai,与贪心法矛盾,所以 w≥ai−1。(1)
因为 w 是最小的,所以 G(w−aj)=M(w−aj),因为 i 是 M(w) 的最小非零位且 M(w) 与 M(w−aj) 的区别只有第 j 维差一,所以 M(w−aj) 前 i−1 维都是 0。
G(w−aj)=M(w−aj) 得出 G(w−aj) 前 i−1 维都是 0,所以 w−aj<ai−1。(2)
由 (1):ai−1−1−ai<w−ai,所以 G(ai−1−1−ai)<G(w−ai)=M(w−ai),两边都给第 i 维加一,得到 G(ai−1−1)<M(w)。
由 (2):有 w−aj≤ai−1−1,则 G(w−aj)≤G(ai−1−1),所以 M(w−aj)≤G(ai−1−1)。
所以,M(w−aj)≤G(ai−1−1)<M(w)。
这说明第 j 维的改变会使大小关系发生变化,因此 M(w) 与 G(ai−1−1) 前 j−1 维相同,而 M(w) 在 [j+1,n] 维都是零,因此 M(w) 第 j 维大于 G(ai−1−1) 的第 j 维。
有没有可能 M(w) 的第 j 维 − G(ai−1−1) 的第 j 维 ≥2 呢?不可能,稍微玩玩就知道了。
471.CF2032
E
考虑对序列循环差分,可到 1 1 -1 -1
,然后有 1 1 0 0 -1 -1
,因为序列长度为奇数,最后可以操作回来,得到 -1 0 1
,继续扩展,就等价于任意位置加 1,任意位置减 1。
F
考虑如果有两段,后面段先手必败,那么前面段需要两个人都想拿到最后一个,否则后面段先手必败,前面段每个人都想将最后一个给另外一个人,那么就是反 nim
游戏了。
从后往前 dp
,fi,0/1 表示考虑 [i,n],最后一段是 nim
游戏还是反 nim
游戏,然后要求后面所有段最后都先手必胜的方案数。
注意到 nim
游戏和反 nim
游戏的胜负条件仅在 ai 全为 1 时不同。
优化转移即可。
472.CF2028
E
先手必然往上走,后手必然拉他往下面走。
设 fu 表示从 u 开始获胜的概率,那么有 fu=ffa+fv2。
设 ku,bu 转移即可。
F
把序列分成若干段,问每段乘积之和是否可以 =m。
注意到乘积只有 logm 种,每种维护或和,可以做到 O(nlogmw)。
473.mx19
A
考虑按照左端点排序,考虑新加一个线段,若最早结束的可以选择这个线段,就选择,否则加入这个线段的右端点,替换掉最大的右端点,有点反悔贪心的味道。
m=1,经典的线段覆盖问题!!就是按照右端点排序依次选择。
考虑扩展,每次判断能否选择即可,即每个点被覆盖的次数 ≤m。
B
记 fi,j 表示到点 i,在 dfs
序第 j 位方案数。
那么可以由父亲转移到儿子,稍微推一下转移就好了。
C
考虑一个数插入的贡献,相当于每次在大根笛卡尔树上,一个数的贡献就是顺着其所在的左/右链一直走走到拐弯为止的点的高度减去原数。
考虑从大到小插入,每次相当于插入到叶子上,假设 h1<h2<h3<⋯<hn,现在插入 hi,玩一玩发现,每种贡献都是可能的,即 hi+1−hi,hi+2−hi,⋯,hn−hi。
bitset
优化背包即可。
D
474.mx20
A
一次复制后面跟着若干粘贴,对应序列 a1,a2,⋯,ak,ai≥2,那么个数是 ∏ai,代价是 (x−y)k+y∑ki=1ai。
显然 k 是 O(logn) 级别,且显然不会存在某个 ai,aj,满足 ai≤aj−2,否则,小的变大一,大的变小一,总和不变,乘积变大,故序列 a 极差 <2。
枚举 k,设 ai=t 或 t+1,分别枚举有 p 个 t,k−p 个 t+1,那么我们只需使得 tp(t+1)k−p>n,找到最小的 t,二分即可,时间复杂度 O(log4n)。
B
简单题。
C
D
475.双栈模拟 deque
妙妙东西。
会模拟“队列”,但是不太会双端队列。
做法是在右边的栈为空时,我们不全部移动左边的数,考虑只移动一半。
具体地,如果 pop
时对应的栈为空,就将另一个栈的元素移动一半给这个栈,时间复杂度为线性。
证明考虑设 ki 为第 i 次重构时 deque
最大值的大小,qi 为第 i−1 次重构到第 i 次重构之间加入的元素数量,那么有 ki=ki−12+qi,重构的总时间复杂度为 O(∑ki),发现 qi 对 ki+j 有 qi2j 的贡献,那么总时间复杂度是 O(∑qi+qi2+qi4+⋯)=O(∑qi)。
例题:CF2026F
发现如果只建操作一二的版本树,那么题目等价于维护一个祖先到儿子的双端队列,支持合并查询。
同步建出操作一二三的版本树,也是可以的,每次跑到操作三的版本就是 pop_front
。
用上面的技巧就行了。
476.[ARC176C] Max Permutation
首先连出边,建出图。
考虑一个点连的边,如果存在两个相同的,那么这个点必然是那个值,且那个值必须是连边最小的最小值,可以断掉所有边,并且给某些点添加上界。
否则,这个点的权值 ≤ 连边最小值,可以将除了最小值的边确定方向,递归判断即可,一个点必然只能被最小值的边确定方向。
剩下每个点度数最多为 1,只会是两个点的链或孤立点。
对于 (u,v),显然 bu,bv≤c,若 bu<c 或 bv<c 那么这就确定了,所以只有 bu=bv=c。
变成一个经典问题,按照 bu 从小到大排序,维护 ≤bu 的可行位置 x:
- 如果是两个点的链,x 扩展,从 x 中选 2,x 减 2。
- 同理。
做完了。
477.[ARC186C] Ball and Box
妙!!
考虑发球的人的决策,如果盒子人存在一种颜色无法放了,那么发球就会发那种颜色的球,否则,发球人会快速填满容量最小的盒子,然后再放一个这个颜色的球,这样就需要买新盒子了。
为什么呢,因为盒子人有结束游戏的权利,我们发球人的策略是让前缀 max 尽量小,就是让负增长来得尽量快。妙!!!!
具体来说,维护一个集合 S:
- 当 |S|<m 时,加入 (v,p),获得 −(p−1) 的收益。
- 当 |S|=m 时,删除 v 最小的对,获得 v−1 的收益。
将箱子按照容量排序,钦定获得正收益之前容量最小的箱子为 t,选出 m 个箱子,箱子人肯定在获得正收益后结束游戏,那么 S 就是在 [1,t−1] 选出所有 v−p>0 的(已经删去的箱子),后缀选出代价前 m−1 小的。
注意容量相同的代价更大的放前面,这样只会产生代价小的负贡献,代价大的可能无贡献,稍微讨论一下就行了。
478.BEST 定理:有向欧拉图的欧拉回路个数为:内向树个数乘以 ∏i=1ndegi,其中 deg**i 为 i 号点的度数。
479.https://www.cnblogs.com/ying-xue/p/Euler-circuit.html
480.[ARC186E] Missing Subsequence
非常妙的题,五星好评!!
考虑先去掉“b 不是子序列”的限制。
判断是否合法,每次扩展一个最短的段,使得 1∼k 都在这个段里出现过,扩展 m 次就合法。(经典结论。
这个序列的结构成功刻画,就是至少 m 个合法的段拼起来,后面任意填。
考虑原问题,注意到关键性质,在原问题中合法段必须是 m−1 个,且剩下的后缀必然是在一个完整段的基础上删掉一个形成的,因为最后一个字符独一无二,并且可以发现第 i 段的结尾一定是 bi。
但是这样我们只是避免了 b 的出现,可能会有一个序列也同时无法出现。
考虑贪心找一个序列 c,b≠c,也不出现,考虑让 c 恰好一个位置与 b 不同,否则若有多个位置不同且不出现,那么保留最后一个不同的位置也是可以成功的!!注意到一个段被匹配两次就必然出现了。
所以我们阻止改策略的方法就是形如 [1,4,2,3,"4",5][1,2,3,5,4],注意到如果没有带引号的 4,那么 24 与 54 匹配位置相同,将其他项也相同,就成功构造了一个不出现的序列,那么我们的策略就是在 bi 之前放上一个 bi+1,让它们在第 i 段被拦住。
如果 i=m 或 bi=bi+1,就无需添加位置。
如果 bi≠bi+1,细节分析一下即可。
简单处理出两种段的 dp
数组,卷 m 次即可。
结尾可以新加 bm+1=bm,卷 m 次,求出 fn+1 就是答案。
481.[ARC186D] Polish Mania
开始写 atcoder 的题解了!!
发现一个序列合法当且仅当:
- ∑iai=len−1。
- ∀i∈[1,n]∑nj=iaj≥n−i。
真是必要又充分啊!具体点应该是每个点找最近的和为 len−1 的点匹配,要求匹配不交。
枚举前缀,就变成了反射容斥,注意到 ai 总和是 O(n),故时间复杂度 O(n)。
482.[ARC184C] Mountain and Valley Folds
折下纸应该可以发现。。
将下表根据 lowbit
分类,同一类的必然是 VMVMVM...
。
归纳证明,第一个折痕必然是 V
。
假设前 2c−1 条奇数编号的折痕形如 VMVMVM...
,第 2c 条折痕会将前面这些折痕对称过去并取反(例如会在 VMVMVMV
末尾接上 MVMVMVMV
,变为 VMVMVMVMVMVMVMV
),因此前 2c+1−1 条奇数编号的折痕也满足这个结构。
于是一个点是上凸的当且仅当 ⌊x/lowbit(x)2⌋ 是奇数。
对于每个 ak,考虑枚举 lowbit
,如果有一棵从低位往高位的 trie
,表示每个 i 对应的 f(i)。
那么就是对一个子树加 1。
模拟一下,最后遍历 trie
求出 f(i) 的最大值即可。
483.[ARC184D] Erase Balls 2D
妙妙!
数剩下球的集合似乎不太好做,考虑选择的球的集合。
如上,圆点表示选择的点,那么留下来的点就是红条覆盖的地方。
但是这样会算重,就是一种留点方案可能有不同的操作方法,显然这些操作方法互相包含,一定有一个全集,使得再操作了这个全集后,操作任意点都会改变红条。
具体来说,就是对于选择的相邻的点 i,j,不存在 xi<xk<xj,yi>yk>yj,满足 (i,k) 围成的矩形和 (k,j) 围成的矩形包含的点与 (i,j) 相同。
于是每次判断合法转移点转移即可,时间复杂度 O(n3)。
484.[ARC183C] Not Argmax
妙啊!怎么会想到!!!
考虑区间 dp
,设 f[l,r] 表示考虑了被 [l,r] 包含的限制下区间填数的方案数。
本来想,如果有限制与 [l,r] 有交就不好做了。
但你仔细想想,转移考虑枚举 [l,r] 考虑被包含的限制,合法的最大值点 p,从 f[l,p−1],f[p+1,r] 转移过来,是对的!!!
那么 f[l,r]←∑p(r−lp−l)f(l,p−1)f(p+1,r)。
就做完了。
485.[ARC183D] Keep Perfectly Matched
非常妙的题!!
首先,一棵树的完美匹配最多一个。
发现,操作两个叶子,将其路径拎出来,一定是匹配边与非匹配边交替,因为不会出现相邻的匹配边和相邻的非匹配边,那么操作完就是路径取反。
再考虑最大化每次操作路径长度,考虑上界,对于一条边 (u,v),其贡献是 min(szu,szv)。
经典问题,考虑以重心为根,这样不同子树的叶子两两匹配,可以证明一定合法且能匹配。
随便定个根,我们希望每次操作删掉的两个叶子不在根的同一棵子树中,因为这样就可以最大化每条边的贡献。由上面的推论可知,这两个叶子必然有一个位于根的匹配点的子树中,于是一次操作就是选一个不是根的匹配点的儿子,然后删掉其中的一个叶子和根的匹配点的子树中的一个叶子,并使得根的匹配转移到这个点上。
再简略一点,这就是说,一开始有若干个子树,我们先将某个子树删掉一个点,然后跳到另一棵子树删掉两个点,再跳到另一棵子树删掉两个点,问能不能删完。显然有一个充要条件是最大子树的大小不超过一半(不用担心奇偶性的问题,因为除了初始的匹配子树,其他子树的大小都是偶数,且匹配子树在一开始已经被删了一个点,也成了偶数),这正是重心的定义。
因为,先不考虑一个子树怎么操作,先考虑匹配,每次一定只有一个奇数子树,每次需要选择一个奇数子树的叶子与偶数子树的叶子匹配,可以证明这样是可以的。
再考虑操作一个子树,对于点 u,如果他初始匹配点是他的父亲,那么往下到儿子的边就是非匹配边,于是可以以任意顺序删掉他的所有儿子,然后删掉他自己。
否则,往下的边是匹配边,这意味着我们第一个删的只能是它的匹配点,并且在删掉匹配点后它的匹配点就变成了父节点,于是我们就可以以任意顺序删掉它剩下的所有儿子,最后删掉它自己。于是对每棵子树跑一遍 dfs
就是处理出合法的删点顺序了。妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!
做完了。
486.loj6564
妙妙题。
487.求值
不难改写第一类斯特林数 fi,j=aifi−1,j−1+(i−1)fi−1,j。
于是 f(n) 的生成函数即为 ∏ni=1(aix+i−1)。
妙妙结论!!!:有多项式 P,Q 和函数 c(F)=gcdi([xi]F),则 c(PQ)=c(P)c(Q)。
我们只需证明 c(P)=c(Q)=1 时,有 c(PQ)=1。
设 p|c(PQ),其中 p 为某质数,当 |P|>1 或 |Q|>1 时,重复一下步骤:
我们有 PQ 的最高项是 p 的倍数,那么 P,Q 中至少有一个最高项为 p 的质数,假设为 P 的最高位,设 P′ 为 P 去掉最高位,那么依旧有 p|c(P′Q),以此类推,规约到 P,Q 都只剩常数项,此时 P,Q 非常数项都是 P 的倍数,因为 c(P)=c(Q)=1,故二者常数项均不整除 p,矛盾。
488.CF2029G Balanced Problem
类似题:CCPC final 2023 chengdu A.add one 2
判断一个序列 a,能否由操作得出:对于 i,若 ai<ai+1,那么操作中一定由对 i+1 进行后缀加 ai+1−ai 次,ai>ai+1 同理,此时所有必要的操作进行完了,所有数都相等。
不妨设 a0=an+1=M,其中 M 为极大值,则 ∑ni=0max(ai−ai+1,0)=∑ni=0max(ai+1−ai,0)。
条件为 a0≥∑ni=0max(ai−ai+1,0),an+1≥∑ni=0max(ai+1−ai,0)。
两者相加,有 ∑ni=0|ai+1−ai|≤2M 或者说 ∑n−1i=1|ai+1−ai|≤a1+an
注意到,若某个 ai>V,这个数没有意义,可以删除,也不影响剩下序列合法性,现在值域为 O(V)。
然后,相邻相等的元素可以合并,即一起操作,且 ci 求和,则 |ai+1−ai|>0,那么此时序列长度 ≤a1+an≤2V。
为什么可以合并,假设有一组最优解,考虑若初始 ai=ai+1,若这组最优解中,某一个数成功贡献了(没有成功贡献随便调整就行了),假设为 i,那么当某一前缀加包含 i 时,扩展到 i+1,当某一后缀加包含 i+1 时,取消 i+1,退回到 i+2,那么最终有 ai=ai+1 且不影响其他的值,更优,调整大法好!
考虑选择若干个元素,将其通过操作提升到相同高度,设选择了 p1,p2,⋯,pk,考虑能提升到的高度的最小值,同上,若 api<api+1,则需要对 pi 前缀加 api+1−api 次,稍微玩一玩发现,能提升的最小高度就是 ap1+∑ki=1max(api+1−api,0),考虑添加 p0=0,就是 H=∑ki=0max(api+1−api,0),美观度为 C=∑ki=1cpi。
这意味着 C 可以贡献给 ≥H 的所有 v。
设 fi,j 表示选择到 i,提升高度的最小值为 j,美观度的最大值,则:
分别考虑 ai 和 ak 的关系:
从小到大枚举 i,开 2V 个树状数组,对于前 V 个,第 j 个存所有 f(i,j),对于后 V 个,第 j 个存所有 f(i,j+ai),容易转移,O(V2logV)。
妙妙,本质上是个二维偏序!!!
以下是做法 2。
咕咕,还没看懂、、感觉挺自然的。
考虑 dp
,枚举 v 并计算答案,设 fi,j,k 表示前 i 个位置,有 j 次未结尾的前缀操作,k 次后缀操作,转移是,前缀操作可以选择一部分继承到下一个位置,剩下的结束,后缀操作必须继承到下一位,也可以在这个位置新开一些操作,发现当 j+k+av≠v 时,最优策略一定是不改变 j,k,因为这样留给后面更多操作空间,妙啊!!!因此转移为:
使用二维树状数组,时间复杂度 O(V3log2V)。
如何优化,每个 v 重新算太浪费了。
考虑改变 k 这维的意义,表示只考虑有 v−k 个后缀操作,那么需要转移的 (j,k) 满足 j+ai=k。
每次找出这 O(v) 个位置转移,v 的答案即为 (0,0) 到 (v,v) 的矩形的最大值。
489.欧拉回路问题
欧拉路指的是:存在这样一种图,可以从其中一点出发,不重复地走完其所有的边的路径。
如果欧拉路的起点与终点相同,则称之为欧拉回路。
显而易见,欧拉路存在的充要条件如下:
- 图联通。
- 对于无向图:有且仅有两个点,度数为奇数,其他点度数都是偶数;或所有点度数都是偶数。对于两个奇数点,一个为起点,一个为终点。起点需要出去,终点需要进入,故其必然与奇数个边相连。
- 对于有向图:除去起点和终点,所有点的出度与入度相等。起点出度比入度大1,终点入度比出度大1。若起点终点出入度也相同,则为欧拉回路。
dfs
寻找欧拉回路,从起点开始,每次若一条边能走,就走,标记删除这条边,可以使用当前弧优化。
490.CF547D
将点看成连接其横坐标和纵坐标的边, 我们为每一条边定向, 使得每一个点的入度与出度的差的绝对值不超过 1。
显然度数为偶数的点入度必须等于出度,而度数为奇数的点入出度恰好差 1。
妙妙转化:我们将度数为奇数的点连边到虚拟点,由于度数为奇数的点必然有偶数个,于是对新图跑欧拉回路即可,必然有解,而有解可以构造出原问题的解。
491.CF429E
设红色边为区间 +1,蓝色为 −1,那么要求每个点绝对值 ≤1,显然可以离散化。
若每个点覆盖次数都为偶数,那么显然等价于最终方案每个点都是 0,即差分数组都是 0,那么 (li,ri+1) 连双向边,要求每个点入度等于出度,跑欧拉回路即可。
否则,有奇数度数点,取出,(A2i,A2i+1) 连边,这样可以使得每个点度数都是偶数,且原来奇数度数点有且仅有一条虚拟边,跑完欧拉回路,就会满足入度出度差绝对值 ≤1 了。
492.求解
显然自由元很多,那么异或和为 0 的子集就很少,枚举一下判断即可。
直接从原序列上搞,有解就是 1 个数 ≥k 且连续段个数 ≤k。
493.求和
发现,若去掉只能交换 ai,bi 的条件,2n 个数可以任意排列。
权值显然是排序后,考虑每个数在另一个序列中比他小的个数要尽量小,发现最优解结构为 p2i−1 与 p2i 不在同一个序列,这样一定能达到 ∑2ni=1pi×(n−⌊i2⌋)。
否则若存在 p2i−1,p2i 在同一个序列,必然存在 p2j−1,p2j 在另一个同一个序列,不妨设 i<j,那么虽然 p2i 变少了,但是 p2j 变多了,不优,总能调整。
连边,表示这两个点颜色不同,假设有黑边 (ai,bi),白边 (p2i−1,p2i)。
可以证明图一定是二分图,每个点都有且仅有一条黑出边和白出边,若存在奇环,那么必有一个点拥有两条颜色一样的出边,矛盾,故原图是二分图,妙妙!!
方法二。
494.CF2022D2
考虑简单版,我们可以通过询问 (a,b),(b,a) 确定 a,b 中是否有内鬼。
如果有,那么选择这两人中的一个和外面的一个人再问两次即可确定内鬼。
这样奇数是 n+1,偶数是 n。
似乎可以证明最优解 ≥n。
当 n=3 时,不能优化,考虑 n≥5 且 n 为奇数。
思考能有一开始就除去三个,发现问 (1,2),(2,3),(3,1),应该全是 yes
或者一个 yes
两个 no
。
否则说明在它们之间,再用 4 次确定是谁,否则我们就用 33 次排除了三个人。
这样 n≥7 就最优了。
当 n=5 时,发现 4 次中有重复问的,所以只需用 5 次,也最优了。
证明 n−1 次询问,不可能中找到内鬼。
495.MST
考虑 MST 的以下两个性质:
- 对于所有 MST 都有每种权值的边出现次数相同
- 对于所有 MST 的每一个边权 v,加入边权为 v 的边后连通块的状态都是一样的。
496.BEST 定理
对于一个欧拉图(有向图)而言,其以 x 出发,x 结束的欧拉回路的个数为 C×dux∏u∈V(duu−1)!,其中 C 为以 x 为根的根向树(叶向树也没问题,因为反正是欧拉图,每个点入度等于出度)的个数,duu 表示 u 的出度。
证明:
考虑图的任意一棵根向树,对每个以 u 为起点的所有不在根向树上的 duu−1 条出边钦定一个顺序,当然,根节点有 duu 条出边。我们称这个根向树及这个出边的排列顺序为一个“组合”,显然我们需要证明两个部分:
- 每个组合唯一对应一条欧拉回路。
- 每条欧拉回路唯一对应一个组合。
先考虑第一个命题,我们考虑这样一个走法:从根节点开始,每到达一个节点,如果除了该节点与其在根向树上与父亲相连的边,其余边都被走过了,那么就沿着根向树上的边走向其父亲,否则就按照钦定的顺序走向下一条边。
显然这样每条边最多被访问一次,不过为什么这样走总可以得到一个欧拉回路呢?会不会走到一个地方走不下去了呢?
考虑反证法,假设走到某个点 u 之后走不下去了,如果 u 不是根节点,那么显然我们每次经过 u 都会经过它的一条入边和一条出边,而这次访问 u 只访问了 u 的一条入边,也就是说 u 的入边个数等于出边个数 +1,与原图为欧拉图矛盾。如果 u 是根节点并且到达 u 的时候没有访问完全部边,那么必然 存在某条根向树上的边 e=(x,fa[x]) 没有被访问,这样一来 (fa[x],fa[fa[x]]),(fa[fa[x]],fa[fa[fa[x]]]),⋯ 也都不会被访问,也就是说根节点存在一条入边没有被访问,根据原图为欧拉图知 u 必然有一条出边没有被访问,矛盾!因此每个组合唯一对应一条欧拉回路。
再考虑第二个命题,我们记 eu 为 u 最后走出去的出边,不考虑根节点,下证所有 eu 构成一棵根向树,还是采用反证法,如果有环,那么根节点必然不会在环上,而由于环上的某个点 x 走一圈之后还能回到 x,根据原图是欧拉图,x 的入度等于出度,即访问完 ex 后 x 经过的入边条数等于出边条数,而绕一圈又回到了 x,又对 x 经过的入边条数产生 1 的贡献,故 x 的入度等于出度 +1,矛盾!
问题: 给定 n 个节点 m 条边的有向欧拉图,求欧拉回路数。
解法: 考虑用同样的方法求出。为了去重,钦定 1 号点的一条出边为第一条访问边。
问题: 给定 n 个节点 m 条边的有向半欧拉图,求欧拉路径数。
解法: 将该图添加一条有向边变成欧拉图,新图的欧拉回路和原图的欧拉路径构成双射,用 BEST 定理计算即可。
似乎 BEST 定理也能计算欧拉路径数量,在半欧拉图上。
497.CF1919E
498.AT_arc187_c
P→P′ 显然是前缀 max 做轮换。
从 P′ 考虑就是选择若干个 P′i 单调上升,且每一个 P′i 是其所在段的最大值,发现其等价于 P′ 的前缀最大值,即在前缀最大值中选择若干个,都满足条件,于是答案就是 2前缀max个数−1。
考虑对 P′ 进行 dp
,因为一个 P 唯一对应一个 P′,将 Q 填充成若干 P′,计算每个 P′ 的方案求和,就是答案。
妙妙了。
记 fi,j 表示考虑 [1,i],前缀 max=j,发现如此记录竟能转移!!!!
因为当前位置在前缀 max 不变的情况下的填数方案数是固定的,而这种情况下填什么数都没有影响,似乎和那道扩展 max,填 mex 的题很像!!!
499.P11291 【MX-S6-T3】「KDOI-11」简单的字符串问题 2
简单题,妙妙!
定义 gi 为最大的 j 使得 T[l,j] 合法。
可以贪心求使得 (l,r) 合法的最小 k,即每次取已扩展的 maxg 扩展。
发现,定义 pi 表示 j∈[i,gi],使得 gj 最大,那么扩展过程可以看作 i→pi 跳 k 次,妙妙!!!
建成一个内向树,稍微数数就好了。
500.小 H 的积木(jimuuu)
维护一下能配对的栈顶,贪心取最小字典序即可。
501.小 H 的树(tree)
sb 题。
502.小 H 的串(string)
对于这种进行若干操作得到一个结果,并要求本质不同结果的题。
一种想法是对操作去重,另一种想法是对合法结果计数,也就是 dp
套 dp
。
第一种之前出现过了。
贪心不好判断合法,发现可以 dp
,将 dp
状态共 2m 个作为状态即可。
503.小 H 的蛋糕(cake)
tp=0 是简单的。
竟然能观察到凸性!!!!对啊,恰好取 k 个区间,关键词触发了。
问题变为,选择若干个区间,计算覆盖所有位置的最大权值,显然权值和为正数的区间必选,还可以视情况选择其他区间。
考虑 dp
,记 fi,j 表示考虑 [1,i],最前的没被覆盖的位置为 j 的最大权值,fi,0 表示所有位置都被覆盖的最大权值。
找到以 i+1 为右端点,且权值为正的区间左端点最小值 p,那么 fi,k,k≥p 还有 fi,0 都能转移到 fi+1,0,同时,所有 fi,k,k<p 都会加上这些正区间的权值转移到 fi+1,k。
考虑 fi,k,k<p 转移到 fi+1,0 的条件,就是选择了 [x,i+1],x≤k 的区间进行覆盖,代价为 si+1−sx−1−C,选择前缀前缀和最小值转移即可。
妙妙 dp
设计,发现这样最前的没被覆盖的位置每次要么不变,要么不见了,不会动,转移方向是 O(1) 的。
时间复杂度 O(nlog2n)。
504.a
容易推出式子为,有若干实数对 (ai,bi),最小化 ∑ni=1∏i−1j=1bjai。
发现可以 exchange argument
,推出条件排序即可。
505.b
随机化。
506.c
很妙的题。
等价于在一个双向的完全图上数 a→b,b→c,a→c 且边权都相同的三角形。
考虑容斥,钦定某两条边颜色不同,于是只需要 inu,0/1,outu,0/1 表示每条边入边颜色为 0/1 的边数,出边颜色为 0/1 的边数。
点分治容易计算。
对于钦定的两条边的交点进行计算即可。
507.防诈骗(game)
容易将去掉 lowbit 后相同的归一类,每一类是独立的,发现每一类其实就是个 nim 游戏,于是整个游戏的 SG(n) 为 ⊕ni=1lowbit(i),观察 lowbit(i) 的函数后可以找出类似倍增的规律,即 SG(n) 只与 n 中的 1 有关,变成一个背包问题。
508.CF2030G2
考虑计算一个集合的权值,枚举交点 x,并取最小值,即 minx∑ni=1[ri≤x](x−ri)+[li>x](li−x),显然,若所有区间左右端点都不相同,那么这个值取最小当且仅当 x 左边线段数量等于 x 右边线段数量。
考虑离散化,将相同的端点散开,这样,一定会存在 x 左边线段数量等于 x 右边线段数量的点,且一定在离散化的端点上。
枚举离散化后一个端点 x,左边有 c1 条线段,右边有 c2 条线段,枚举一个在子集里的线段端点,钦定其产生贡献,分类讨论,则答案为:
扫一遍就好了,但是,对于一个子集,会有多个点使得他左右线段数量相等,一定是一段区间,考虑计数最小的那个点,即存在一个线段,其左端点或右端点为 x,这样当 x 继续减小时,会使左边的线段数 −1,或右边的线段树 +1。容斥掉不选这个最小点的情况即可,妙!!!
509.B
记 fi,j 表示型号为 i 的机器人用 j 秒发的最多传单数量,显然一个机器人必然是先生成,再发传单。
考虑两种转移,生成新机器人即为 fi+1,j−ci+fi,j−ci,发传单即为 fi,j−1+1。
注意到我们生成一个机器人后,两个机器人至少可以发 2(j−ci) 张传单,不生成只能发 j 张传单,故当 2(j−ci)≥j 时我们一定生成,否则一定不生成,因为 2(j−ci)<j→j<2ci,所以我们只能生成一次,并且新生成的机器人不能生成了,妙!!!!
这样根据 i,j 可以直接确定转移方向。
但是,我们的转移与 c 有关,并不能解决多次询问。
注意到 2(j−ci)≥j,即为 ⌊jc⌋≥2i,于是我们将状态改为记录 k=⌊jc⌋,将答案表示为 gi,k×c+fi,k×(nmodc)。
因为开始生成机器人的时刻 modc 同余,即 fi,k=j=kc+(jmodc)=kc+(nmodc),k<2i,于是我们分别记录这两项倒推即可,完全想不到啊!!!
考虑转移,k≥2i 时有 fi,k=fi,k−i+fi+1,k−i,gi,k=gi,k−i+gi+1,k−i,否则有 fi,k=1,gi,k=k。
注意到生成一个型号 i 的机器人至少需要 i(i−1)2 妙,所以 i 这一位记录到 O(√n) 即可。
状态数是 O(n√n),转移 O(1)。
就是生成新机器人的时间一定是 c 的倍数,所以每个机器人发传单的时间同余 n mod c,而我们 dp 时只关心 n/c 的值,这样就能使 dp 与 n,c 无关。
妙妙啊!!!
510.复习组合数学之不相邻问题
n 个同类球放进 k 个不同盒子,可空,方案数为 (n+k−1k−1)。
有 n 个球排成一列,从中取出 m 个不相邻的球,问有多少种解法。
相当于将 n−m 个球分成 m+1 份,除了第一份和最后一份可以没有球,其他都要有一个球。考虑给中间 m−1 份每份一个球,问题变为 n−m−(m−1) 个球放入 m+1 个盒子,盒子可以没有球,或者说将 n−m+2 个球放入 m+1 个盒子,盒子必须有球,方案数都为 (n−m+1m)。
有 n 个球排成一个环,从中取出 m 个不相邻的球,问有多少种解法。
随便考虑一个球,钦定他必须选,则他左右都不能选,变成一个 n−3 的链问题,方案数为 (n−m−1m−1)。
再钦定他不能选,则变为 n−1 个球的链问题,方案数为 (n−mm)。
所以总方案数为 (n−mm)+(n−m−1m−1)。
511.P9195 [JOI Open 2016] JOIRIS
妙妙题。
好了这题的条件和 shenyang codeforces 都不同,应该区分。
先考虑模 k 意义下的序列 ai,使得所有数相等,发现列操作无影响,行操作就是对 [x,x+k) 加一。
考虑差分数组 di=ai−ai−1,那么操作是 di←di+1,di+k←di+k−1,而终止条件是 ∀i∈[2,n],di=0,记 br=∑imodk=rdi,有解充要条件是 ∀r∈[0,k),r≠1modk,r≠(n+1)modk,br≡0(modk)。不用考虑 d1 和 dn+1,因为我们可以将多余的数都往这些位置仍。
考虑构造操作 di←di+v,di+k←di+k−v,v∈[0,k)。
- 在 i 处加入 v 个横块,在 [1,n]/[i,i+k) 处加入两个竖块,此时 v 个横块全部被消除,然后,[1,n]/[i,i+k) 这些位置相对 [i,i+k) 减少了 v。
512.mx20 C
妙妙题!!
类似加权随机,观察到再问一遍无影响,于是概率等价于每次随机一个题目问,求变成 s 的概率和。
建出一个 2n 的图,每个点的出边表示转移,注意需要处理自环,且每个点只会向子集转移,处理一下可以做到 O(3m)。
类似子集卷积,按照位数从大往小做,处理出 |s|≥i 的 fs,我们希望求出 |s|=i−1 的 fs,转移类似 fscs×gt→fs∩t,其中 cs 表示与 s 有交且不包含 s 的题目数量,gt 表示情况为 t 的题目数量,要求 0<|s∩t|<s,故使用 |s|≥i 的 fs 与 g 做卷积后取出 |s|=i−1 即为所求。
513.mx20D
问题可以变成我们可以成功排序所有 01 序列。
考虑这个 01 序列单峰或者单谷,分治,对 i∈[1,2k−1],同时执行 F(i,i+2k−1)。
序列形如:
1111111111
1110001111
变成:
1110001111
1111111111
形如:
111000000
000001111
变成:
000000000
111001111
注意到两边都满足单峰或者单谷的条件,可以分治下去。
考虑一般 01 序列,假设左右两边都做好了排序,那么我们只需要将右边翻转,就变成单谷了!!!
套用单谷的分治即可!!
操作数为 F(n)=2F(n2)+G(n),G(n)=n2+2G(n2)。
妙妙!!
514.CF2038E
又是妙妙题!!!
显然是从后往前,每个位置加 hi 的水量,使得平衡后,切割这个位置的水。
考虑维护若干连续段,满足这些连续段水量相等,且加水之后,需要平均分。
考虑加水操作,实际上会跳过后缀若干段,这些段水位与左边管道齐平,找到第一个不满足的段,进行操作,若操作完这个段后水位与右边管道齐平,就与右边段合并。
515.CF1967D
可以二分答案,并且可以双指针判断,即看 a1 是否能到 1,若不能,则看是否能到 2,如果能,a2 就只需从 2 开始判断。
于是问题转化为 O(mlogm) 次判断一个点能否到达一个点。
516.CF1936D
一次询问考虑分治,双指针计算跨过中点的区间贡献,注意到前后缀或只有 O(logV) 个,于是单次计算复杂度 O(logV)。
考虑套到线段树上,就做完了。
517.CF1930E
被薄纱。。。
考虑计数最终序列,1 表示被删除,0 表示留下。
有结论:序列合法当且仅当 1 个数为 2k 的倍数,且存在一个 0,满足左边右边都至少有 k 个 1。
必要性,考虑最后一个操作,中间留下的数必须是 0。
充分性:
设这个 0 的位置为 p,如果某一侧有 ≥3k 个 1,显然可以进行操作,最后两侧 1 个数 ∈[k,3k),且两侧 1 总和只能为 2k 或 4k,此时操作必须跨过两边。
若是 4k,那么直接操作,一定可以操作,就结束了,怎么是这样呢?》????
其实不用 ≥3k 的操作也是可以的。
考虑容斥计算方案,减掉不合法的,设 x 为 1 的个数,考虑首先有一个长度为 x 的全 1 串,往里面插入 n−x 个 0,我们发现 0 只能插在两边 k−1 个 1 的两边,也就是只有 2k 个位置可以插,方案数为 (n−x+2k−12k−1)。
518.复习 CF441E、CF1864H
519.CF1943E2
非常妙的题!!!
这种最大最小博弈可以往二分答案变成胜负游戏的方向考虑。
于是二分答案 [0,lim],问题变为 Bob 能否清空某一个堆。
此时 Alice 就需要拿完 [0,lim] 所有堆中各一个,所以 Alice 的最优策略是每次拿次数最小的堆。
再考虑 Bob 的策略,没有发现。
考虑枚举 Bob 最后清空了的最小堆 j ,那么 Bob 显然不会去操作比他大的堆,因为 Bob 若要去操作比他大的堆,只有可能是将他们操作过来当替罪羊去凑轮数,那么不优于后面的问题,于是 Alice 也不会去操作后面的堆。
发现,Bob 不能操作成 aj<aj−1,这样轮数减一了,非常不优,于是 Bob 最优操作先操作前面的,每次操作是进行 k 轮,目前有其它数的数量和目标的数量相同,那么先删和目标数量相同的数,再删目标。
简单判断一下可以通过简单版。
考虑优化判断过程,发现每次 Bob 取到的数会变成极差 ≤1 的序列,若有 a 个数,和为 b,那么形态是固定的,用 (a,b) 表示这个状态,显然若 (a,b) 先手胜,那么 (a,b+1) 也是先手胜,可以固定 a 二分使得 (a,b) 合法的最小 b,因为这种序列情况下,每次 Alice 删除的堆的个数我是知道的!!,即 (a,b)→(a−1,b−k−⌊ab⌋)。
我们希望计算出一个 j,满足 Alice 操作完 [0,j] 后,剩余序列极差 ≤1,这样就可以 O(1) 判断了。
考虑条件,我们发现,在最小的合法 j,满足在前 j+1 轮,Bob 的操作一定只会操作在 [j+1,t],这时候可以确定判断条件 ⌊st−sj−(j+1)kt−j⌋≤aj+1。
于是我们假定所有 Bob 操作都在 [j+1,t],这样条件是单调的,可以二分出最小 j,简单证明这个最小 j 就是我们要求的,妙!
就做完了,时间复杂度 O(nlog2n),似乎可以双指针优化。
520.CF1930F
著名结论:a+b=(a|b)+(a&b)。
固定产生 max 为 as,min 为 at。
那么最优 x 的出的数应该是 as−(as∧at)。
我们发现答案就是两两 as,at 上面值的最大值,一定取到答案且合法,太脑筋急转弯了吧,应该记下来!!。
现在新加数 v,只需考虑 v 作为 as,at 带来的贡献即可。
前者是 max(v−(v∧ai))=v−min(v∧ai)。
按位贪心,只需知道是否有 ai 是 s 的子集,可以记搜。
后者是 max(ai−(v∧ai))=max((v|ai)−v),转化后变量单一,就能做了。
依旧是按位贪心。
521.ARC187D
分类讨论 c1 选择了 a1 还是 b1。
若 ai,bi 在同侧,无用。
只需要考虑不同侧的对(这样左右就独立了!!!),确定左边最小值,那么比他小的都得选择右括号,可以维护一下前缀右括号最大值 − 当前值的最小值,插入就是后缀取 max,但是发现覆盖就行了。
还有正常做法。
枚举最小值,记 fi 表示最小值为 i 时最小的最大值,显然 fi 单调。
一样区间覆盖。
两个做法各有妙处。
522.CF2029I
发现重要结论 f(x)=∑i(x−ai)2,是二次函数,且最小值在 ∑iain 取到。
于是我们枚举可能的 O(nm) 种平均数 x,计算 f(x) 操作若干次的最小值即可,这样方差和 ai 就独立了!!
问题变为:给定正整数 x,对恰好 i 个区间执行区间 +k 操作,求操作结束后 ∑(ai−x)2 的最小值。
可以建出网络流:
- 对于 1≤i≤n+1,idi,0 分别与 s,t 连边。
- 对于 1≤i≤n,1≤j≤m,idi,0 向 idi,j 连边 (1,(ai−x+jk)2−(ai−x+(j−1)k)2),idi,j 向 idi+1,0 连边。
这样 idi,j 就表示这个点被加了多少次,为什么这样是对的呢,因为你发现平方的差分的单调递增的,所有最优的流一定先流 idi,j,再流 idi,j+1。
考虑模拟费用流,找增广路:
- s 到某个 idx,0,走正向边到 idy,0,x<y,相当于 [x,y−1] 全部扩展一次。
- s 到某个 idy,0,走反向边到 idx,0,x<y,然后走到 t,等价于反悔区间 [x,y−1],减少一次。
直接模拟即可,时间复杂度 O(n2m2)。
上面的 idi,0 其实有点问题,就是要拆成入点和出点。
523.CF1864H
期望进行次数可以转成对还没结束的局面概率求和,即数 <n 的概率求和。
n 自减,考虑让和 =n,在前面补上 δ,转成为操作序列 (δ,a0,a1,⋯,aL),其中 L 表示钦定操作序列进行了 L 次 ×2,满足:
其中减去 2L 是因为开始的 1。
妙妙转化,≤ 变成 =,妙!
这样的操作序列的概率为 12L×12∑a。
感觉是数位 dp
能干的事,记 bi,j 表示 ai 二进制下第 j 位,记 B=logn,有:
其中 d=i+j,记 fd,j 表示 [2d]δ+∑min(L,d)i=0bi,d−i=j 的贡献之和,转移枚举 i 和 bi,d−i 取值为 0/1 即可,计算贡献。
设 dpd,j 表示考虑到第 d 位,前面这一位进位了 j,枚举所有数的第 d 位值之和为 k,贡献为 dpd,j×fd,k→dpd+1,j+k2,需要保证 j+k 进位后剩下值等于 n 的第 d 位。
妙啊!!!
524.CF1930G
显然是考虑相邻前缀最大值转移,记 fi 表示以 i 结尾的序列数量。
考虑寻找转移顺序。
判断一个点是前缀最大值:
- 它的所有祖先编号小于它。
- 之前
dfs
过的祖先的儿子(不是一个祖先)子树 max 小于它。
那么考虑将一个点的所有儿子按照子树 max 升序排序,获得一个 dfs
序,那么以 i 结尾的序列中的值都在 [1,dfni] 中,给了我们一个很好的转移顺序,因为编号并不好考虑,但很好处理,然后我们可以跑一遍这个 dfs
序,这样到 i 时跑过的点就是 [1,dfni] 了,边 dfs
边计数。
考虑上一个前缀最大值 j 转移到 i 的条件,有 j<i,dfnj<dfni,设 d=LCA(i,j)。
- i 的所有祖先编号小于 i。
- 若 j 不是 i 的祖先,那么 d 在 j 方向上的儿子的子树最大值等于 j,且 j 大于 i 的所有祖先。
- 若 j 是 i 的祖先,则 j 是 i 的祖先最大值。
妙妙,因为是计数前缀最大值序列,所以我们不会旁生分支,只考虑必经点。
还有编号限制,考虑用 BIT
维护,我们 dfs
到 i,将 i 的所有祖先即祖先的非祖先儿子的 f 值加入,因为只有这些会转移到 i,并且可以继承。
设 v 为 i 祖先编号最大值,则:
- 若 v>i,则 fi=0。
- 否则 fi=∑j∈BIT,v≤j<ifj。
就做完了,时间复杂度 O(nlogn)。
525.切割蛋糕(cake)
拆式子。
526.游乐园(park)
按照 ai−bi 从大到小排序,枚举分界点,前缀取 bi 前 k 大,后缀按照 ai 从小往大取,能取就取,bit
上二分即可。
527.有根树(tree)
写过了。
528.集合操作(set)
妙妙题。
将 u 向他的所有倍数连边,形成一张 DAG
。
我们考虑给每个点赋一个排列,表示操作时间,如果一个点的权值是他的因子的最小值,那么表示他被操作了。
记 f(p)=∑ni=1[mind|ipd=pi],我们尝试说明 ∑pf(p)=n!×ans。
对于原题,停止后剩下 s 个元素的贡献概率为 s!n!。
考虑拎出一条倍数链,a1,a2,⋯ak,定义下标集合 s 表示被操作过的下标,那么原题的贡献概率为 1n×(s1−1)×(s2−1)×⋯。
而我们对应 s 集合为前缀 min 的排列个数刚好也是这个,很对!
考虑会原来的 dag
上,钦定若干点是因子的 min,但是 dag
的拓扑序不好做。
不会了!!!!
似乎用拓扑序感性理解就很对!!!
考虑一个数的贡献概率,就是所有排列中满足它的因子的 min 的概率就是 1d(i)。
所以答案就是 ∑ni=11d(i),min25
筛即可。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18526206
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!