Typesetting math: 100%

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,jM(w) 的最小最大非零位,严格降序。

结论:G(ai11)M(w)1,,j1 位相同,第 j 位小一。

证明:

G(w)1i1 维一定有非零的,否则因为非零位无交,G(w)i 维为零,因为 M(w)i 维非零,故 wai,与贪心法矛盾,所以 wai1。(1)

因为 w 是最小的,所以 G(waj)=M(waj),因为 iM(w) 的最小非零位且 M(w)M(waj) 的区别只有第 j 维差一,所以 M(waj)i1 维都是 0

G(waj)=M(waj) 得出 G(waj)i1 维都是 0,所以 waj<ai1。(2)

由 (1):ai11ai<wai,所以 G(ai11ai)<G(wai)=M(wai),两边都给第 i 维加一,得到 G(ai11)<M(w)

由 (2):有 wajai11,则 G(waj)G(ai11),所以 M(waj)G(ai11)

所以,M(waj)G(ai11)<M(w)

这说明第 j 维的改变会使大小关系发生变化,因此 M(w)G(ai11)j1 维相同,而 M(w)[j+1,n] 维都是零,因此 M(w)j 维大于 G(ai11) 的第 j 维。

有没有可能 M(w) 的第 j G(ai11) 的第 j2 呢?不可能,稍微玩玩就知道了。

471.CF2032

E

考虑对序列循环差分,可到 1 1 -1 -1,然后有 1 1 0 0 -1 -1,因为序列长度为奇数,最后可以操作回来,得到 -1 0 1,继续扩展,就等价于任意位置加 1,任意位置减 1

F

考虑如果有两段,后面段先手必败,那么前面段需要两个人都想拿到最后一个,否则后面段先手必败,前面段每个人都想将最后一个给另外一个人,那么就是反 nim 游戏了。

从后往前 dpfi,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+1hi,hi+2hi,,hnhi

bitset 优化背包即可。

D

image

474.mx20

A

一次复制后面跟着若干粘贴,对应序列 a1,a2,,ak,ai2,那么个数是 ai,代价是 (xy)k+yki=1ai

显然 kO(logn) 级别,且显然不会存在某个 ai,aj,满足 aiaj2,否则,小的变大一,大的变小一,总和不变,乘积变大,故序列 a 极差 <2

枚举 k,设 ai=tt+1,分别枚举有 ptkpt+1,那么我们只需使得 tp(t+1)kp>n,找到最小的 t,二分即可,时间复杂度 O(log4n)

B

简单题。

C

D

475.双栈模拟 deque

妙妙东西。

会模拟“队列”,但是不太会双端队列。

做法是在右边的栈为空时,我们不全部移动左边的数,考虑只移动一半。

具体地,如果 pop 时对应的栈为空,就将另一个栈的元素移动一半给这个栈,时间复杂度为线性。

证明考虑设 ki 为第 i 次重构时 deque 最大值的大小,qi 为第 i1 次重构到第 i 次重构之间加入的元素数量,那么有 ki=ki12+qi,重构的总时间复杂度为 O(ki),发现 qiki+jqi2j 的贡献,那么总时间复杂度是 O(qi+qi2+qi4+)=O(qi)

例题:CF2026F

发现如果只建操作一二的版本树,那么题目等价于维护一个祖先到儿子的双端队列,支持合并查询。

同步建出操作一二三的版本树,也是可以的,每次跑到操作三的版本就是 pop_front

用上面的技巧就行了。

476.[ARC176C] Max Permutation

首先连出边,建出图。

考虑一个点连的边,如果存在两个相同的,那么这个点必然是那个值,且那个值必须是连边最小的最小值,可以断掉所有边,并且给某些点添加上界。

否则,这个点的权值 连边最小值,可以将除了最小值的边确定方向,递归判断即可,一个点必然只能被最小值的边确定方向。

剩下每个点度数最多为 1,只会是两个点的链或孤立点。

对于 (u,v),显然 bu,bvc,若 bu<cbv<c 那么这就确定了,所以只有 bu=bv=c

变成一个经典问题,按照 bu 从小到大排序,维护 bu 的可行位置 x

  • 如果是两个点的链,x 扩展,从 x 中选 2x2
  • 同理。

做完了。

477.[ARC186C] Ball and Box

妙!!

考虑发球的人的决策,如果盒子人存在一种颜色无法放了,那么发球就会发那种颜色的球,否则,发球人会快速填满容量最小的盒子,然后再放一个这个颜色的球,这样就需要买新盒子了。

为什么呢,因为盒子人有结束游戏的权利,我们发球人的策略是让前缀 max 尽量小,就是让负增长来得尽量快。妙!!!!

具体来说,维护一个集合 S

  • |S|<m 时,加入 (v,p),获得 (p1) 的收益。
  • |S|=m 时,删除 v 最小的对,获得 v1 的收益。

将箱子按照容量排序,钦定获得正收益之前容量最小的箱子为 t,选出 m 个箱子,箱子人肯定在获得正收益后结束游戏,那么 S 就是在 [1,t1] 选出所有 vp>0 的(已经删去的箱子),后缀选出代价前 m1 小的。

注意容量相同的代价更大的放前面,这样只会产生代价小的负贡献,代价大的可能无贡献,稍微讨论一下就行了。

478.BEST 定理:有向欧拉图的欧拉回路个数为:内向树个数乘以 ∏i=1ndegi,其中 deg**ii 号点的度数。

479.https://www.cnblogs.com/ying-xue/p/Euler-circuit.html

480.[ARC186E] Missing Subsequence

非常妙的题,五星好评!!

考虑先去掉“b 不是子序列”的限制。

判断是否合法,每次扩展一个最短的段,使得 1k 都在这个段里出现过,扩展 m 次就合法。(经典结论。

这个序列的结构成功刻画,就是至少 m 个合法的段拼起来,后面任意填。

考虑原问题,注意到关键性质,在原问题中合法段必须是 m1 个,且剩下的后缀必然是在一个完整段的基础上删掉一个形成的,因为最后一个字符独一无二,并且可以发现第 i 段的结尾一定是 bi

但是这样我们只是避免了 b 的出现,可能会有一个序列也同时无法出现。

考虑贪心找一个序列 c,bc,也不出现,考虑让 c 恰好一个位置与 b 不同,否则若有多个位置不同且不出现,那么保留最后一个不同的位置也是可以成功的!!注意到一个段被匹配两次就必然出现了。

所以我们阻止改策略的方法就是形如 [1,4,2,3,"4",5][1,2,3,5,4],注意到如果没有带引号的 4,那么 2454 匹配位置相同,将其他项也相同,就成功构造了一个不出现的序列,那么我们的策略就是在 bi 之前放上一个 bi+1,让它们在第 i 段被拦住。

如果 i=mbi=bi+1,就无需添加位置。

如果 bibi+1,细节分析一下即可。

简单处理出两种段的 dp 数组,卷 m 次即可。

结尾可以新加 bm+1=bm,卷 m 次,求出 fn+1 就是答案。

481.[ARC186D] Polish Mania

开始写 atcoder 的题解了!!

发现一个序列合法当且仅当:

  • iai=len1
  • i[1,n]nj=iajni

真是必要又充分啊!具体点应该是每个点找最近的和为 len1 的点匹配,要求匹配不交。

枚举前缀,就变成了反射容斥,注意到 ai 总和是 O(n),故时间复杂度 O(n)

482.[ARC184C] Mountain and Valley Folds

折下纸应该可以发现。。

将下表根据 lowbit 分类,同一类的必然是 VMVMVM...

归纳证明,第一个折痕必然是 V

假设前 2c1 条奇数编号的折痕形如 VMVMVM...,第 2c 条折痕会将前面这些折痕对称过去并取反(例如会在 VMVMVMV 末尾接上 MVMVMVMV,变为 VMVMVMVMVMVMVMV),因此前 2c+11 条奇数编号的折痕也满足这个结构。

于是一个点是上凸的当且仅当 x/lowbit(x)2 是奇数。

对于每个 ak,考虑枚举 lowbit,如果有一棵从低位往高位的 trie,表示每个 i 对应的 f(i)

那么就是对一个子树加 1

模拟一下,最后遍历 trie 求出 f(i) 的最大值即可。

483.[ARC184D] Erase Balls 2D

妙妙!

数剩下球的集合似乎不太好做,考虑选择的球的集合。

iaxzym1c

如上,圆点表示选择的点,那么留下来的点就是红条覆盖的地方。

但是这样会算重,就是一种留点方案可能有不同的操作方法,显然这些操作方法互相包含,一定有一个全集,使得再操作了这个全集后,操作任意点都会改变红条。

具体来说,就是对于选择的相邻的点 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,p1],f[p+1,r] 转移过来,是对的!!!

那么 f[l,r]p(rlpl)f(l,p1)f(p+1,r)

就做完了。

485.[ARC183D] Keep Perfectly Matched

非常妙的题!!

首先,一棵树的完美匹配最多一个。

发现,操作两个叶子,将其路径拎出来,一定是匹配边与非匹配边交替,因为不会出现相邻的匹配边和相邻的非匹配边,那么操作完就是路径取反。

再考虑最大化每次操作路径长度,考虑上界,对于一条边 (u,v),其贡献是 min(szu,szv)

经典问题,考虑以重心为根,这样不同子树的叶子两两匹配,可以证明一定合法且能匹配。

随便定个根,我们希望每次操作删掉的两个叶子不在根的同一棵子树中,因为这样就可以最大化每条边的贡献。由上面的推论可知,这两个叶子必然有一个位于根的匹配点的子树中,于是一次操作就是选一个不是根的匹配点的儿子,然后删掉其中的一个叶子和根的匹配点的子树中的一个叶子,并使得根的匹配转移到这个点上。

再简略一点,这就是说,一开始有若干个子树,我们先将某个子树删掉一个点,然后跳到另一棵子树删掉两个点,再跳到另一棵子树删掉两个点,问能不能删完。显然有一个充要条件是最大子树的大小不超过一半(不用担心奇偶性的问题,因为除了初始的匹配子树,其他子树的大小都是偶数,且匹配子树在一开始已经被删了一个点,也成了偶数),这正是重心的定义。

因为,先不考虑一个子树怎么操作,先考虑匹配,每次一定只有一个奇数子树,每次需要选择一个奇数子树的叶子与偶数子树的叶子匹配,可以证明这样是可以的。

再考虑操作一个子树,对于点 u,如果他初始匹配点是他的父亲,那么往下到儿子的边就是非匹配边,于是可以以任意顺序删掉他的所有儿子,然后删掉他自己。

否则,往下的边是匹配边,这意味着我们第一个删的只能是它的匹配点,并且在删掉匹配点后它的匹配点就变成了父节点,于是我们就可以以任意顺序删掉它剩下的所有儿子,最后删掉它自己。于是对每棵子树跑一遍 dfs 就是处理出合法的删点顺序了。妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!妙啊!!!!

做完了。

486.loj6564

妙妙题。

image

487.求值

不难改写第一类斯特林数 fi,j=aifi1,j1+(i1)fi1,j

于是 f(n) 的生成函数即为 ni=1(aix+i1)

妙妙结论!!!:有多项式 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 的最高位,设 PP 去掉最高位,那么依旧有 p|c(PQ),以此类推,规约到 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+1ai 次,ai>ai+1 同理,此时所有必要的操作进行完了,所有数都相等。

不妨设 a0=an+1=M,其中 M 为极大值,则 ni=0max(aiai+1,0)=ni=0max(ai+1ai,0)

条件为 a0ni=0max(aiai+1,0),an+1ni=0max(ai+1ai,0)

两者相加,有 ni=0|ai+1ai|2M 或者说 n1i=1|ai+1ai|a1+an

注意到,若某个 ai>V,这个数没有意义,可以删除,也不影响剩下序列合法性,现在值域为 O(V)

然后,相邻相等的元素可以合并,即一起操作,且 ci 求和,则 |ai+1ai|>0,那么此时序列长度 a1+an2V

为什么可以合并,假设有一组最优解,考虑若初始 ai=ai+1,若这组最优解中,某一个数成功贡献了(没有成功贡献随便调整就行了),假设为 i,那么当某一前缀加包含 i 时,扩展到 i+1,当某一后缀加包含 i+1 时,取消 i+1,退回到 i+2,那么最终有 ai=ai+1 且不影响其他的值,更优,调整大法好!

考虑选择若干个元素,将其通过操作提升到相同高度,设选择了 p1,p2,,pk,考虑能提升到的高度的最小值,同上,若 api<api+1,则需要对 pi 前缀加 api+1api 次,稍微玩一玩发现,能提升的最小高度就是 ap1+ki=1max(api+1api,0),考虑添加 p0=0,就是 H=ki=0max(api+1api,0),美观度为 C=ki=1cpi

这意味着 C 可以贡献给 H 的所有 v

fi,j 表示选择到 i,提升高度的最小值为 j,美观度的最大值,则:

fi,ji1maxk=0f(k,jmax(aiak,0))+ci

分别考虑 aiak 的关系:

fi,j=ci+max(f(k,j)[ak>ai],f(k,jai+ak)[akai])(0k<i)

从小到大枚举 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+avv 时,最优策略一定是不改变 j,k,因为这样留给后面更多操作空间,妙啊!!!因此转移为:

fi,j,kfi1,u,v+ci(j+k+ai=v,uj,vk)fi,j,kfi1,j,k

使用二维树状数组,时间复杂度 O(V3log2V)

如何优化,每个 v 重新算太浪费了。

考虑改变 k 这维的意义,表示只考虑有 vk 个后缀操作,那么需要转移的 (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 个数可以任意排列。

权值显然是排序后,考虑每个数在另一个序列中比他小的个数要尽量小,发现最优解结构为 p2i1p2i 不在同一个序列,这样一定能达到 2ni=1pi×(ni2)

否则若存在 p2i1,p2i 在同一个序列,必然存在 p2j1,p2j 在另一个同一个序列,不妨设 i<j,那么虽然 p2i 变少了,但是 p2j 变多了,不优,总能调整。

连边,表示这两个点颜色不同,假设有黑边 (ai,bi),白边 (p2i1,p2i)

可以证明图一定是二分图,每个点都有且仅有一条黑出边和白出边,若存在奇环,那么必有一个点拥有两条颜色一样的出边,矛盾,故原图是二分图,妙妙!!


方法二。

image

494.CF2022D2

考虑简单版,我们可以通过询问 (a,b),(b,a) 确定 a,b 中是否有内鬼。

如果有,那么选择这两人中的一个和外面的一个人再问两次即可确定内鬼。

这样奇数是 n+1,偶数是 n

似乎可以证明最优解 n

n=3 时,不能优化,考虑 n5n 为奇数。

思考能有一开始就除去三个,发现问 (1,2),(2,3),(3,1),应该全是 yes 或者一个 yes 两个 no

否则说明在它们之间,再用 4 次确定是谁,否则我们就用 33 次排除了三个人。

这样 n7 就最优了。

n=5 时,发现 4 次中有重复问的,所以只需用 5 次,也最优了。

证明 n1 次询问,不可能中找到内鬼。

image

495.MST

考虑 MST 的以下两个性质:

  • 对于所有 MST 都有每种权值的边出现次数相同
  • 对于所有 MST 的每一个边权 v,加入边权为 v 的边后连通块的状态都是一样的。

496.BEST 定理

对于一个欧拉图(有向图)而言,其以 x 出发,x 结束的欧拉回路的个数为 C×duxuV(duu1)!,其中 C 为以 x 为根的根向树(叶向树也没问题,因为反正是欧拉图,每个点入度等于出度)的个数,duu 表示 u 的出度。

证明:

考虑图的任意一棵根向树,对每个以 u 为起点的所有不在根向树上的 duu1 条出边钦定一个顺序,当然,根节点有 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 必然有一条出边没有被访问,矛盾!因此每个组合唯一对应一条欧拉回路。

再考虑第二个命题,我们记 euu 最后走出去的出边,不考虑根节点,下证所有 eu 构成一棵根向树,还是采用反证法,如果有环,那么根节点必然不会在环上,而由于环上的某个点 x 走一圈之后还能回到 x,根据原图是欧拉图,x 的入度等于出度,即访问完 exx 经过的入边条数等于出边条数,而绕一圈又回到了 x,又对 x 经过的入边条数产生 1 的贡献,故 x 的入度等于出度 +1,矛盾!

问题: 给定 n 个节点 m 条边的有向欧拉图,求欧拉回路数。

解法: 考虑用同样的方法求出。为了去重,钦定 1 号点的一条出边为第一条访问边。

image

问题: 给定 n 个节点 m 条边的有向半欧拉图,求欧拉路径数。

解法: 将该图添加一条有向边变成欧拉图,新图的欧拉回路和原图的欧拉路径构成双射,用 BEST 定理计算即可。

image

似乎 BEST 定理也能计算欧拉路径数量,在半欧拉图上。

497.CF1919E

image

498.AT_arc187_c

PP 显然是前缀 max 做轮换。

P 考虑就是选择若干个 Pi 单调上升,且每一个 Pi 是其所在段的最大值,发现其等价于 P 的前缀最大值,即在前缀最大值中选择若干个,都满足条件,于是答案就是 2max1

考虑对 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 最大,那么扩展过程可以看作 ipik 次,妙妙!!!

建成一个内向树,稍微数数就好了。

500.小 H 的积木(jimuuu)

维护一下能配对的栈顶,贪心取最小字典序即可。

501.小 H 的树(tree)

sb 题。

502.小 H 的串(string)

对于这种进行若干操作得到一个结果,并要求本质不同结果的题。

一种想法是对操作去重,另一种想法是对合法结果计数,也就是 dpdp

第一种之前出现过了。

贪心不好判断合法,发现可以 dp,将 dp 状态共 2m 个作为状态即可。

503.小 H 的蛋糕(cake)

tp=0 是简单的。

竟然能观察到凸性!!!!对啊,恰好取 k 个区间,关键词触发了。

问题变为,选择若干个区间,计算覆盖所有位置的最大权值,显然权值和为正数的区间必选,还可以视情况选择其他区间。

考虑 dp,记 fi,j 表示考虑 [1,i],最前的没被覆盖的位置为 j 的最大权值,fi,0 表示所有位置都被覆盖的最大权值。

找到以 i+1 为右端点,且权值为正的区间左端点最小值 p,那么 fi,k,kp 还有 fi,0 都能转移到 fi+1,0,同时,所有 fi,k,k<p 都会加上这些正区间的权值转移到 fi+1,k

考虑 fi,k,k<p 转移到 fi+1,0 的条件,就是选择了 [x,i+1],xk 的区间进行覆盖,代价为 si+1sx1C,选择前缀前缀和最小值转移即可。

妙妙 dp 设计,发现这样最前的没被覆盖的位置每次要么不变,要么不见了,不会动,转移方向是 O(1) 的。

时间复杂度 O(nlog2n)

504.a

容易推出式子为,有若干实数对 (ai,bi),最小化 ni=1i1j=1bjai

发现可以 exchange argument,推出条件排序即可。

505.b

随机化。

506.c

很妙的题。

等价于在一个双向的完全图上数 ab,bc,ac 且边权都相同的三角形。

考虑容斥,钦定某两条边颜色不同,于是只需要 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,并取最小值,即 minxni=1[rix](xri)+[li>x](lix),显然,若所有区间左右端点都不相同,那么这个值取最小当且仅当 x 左边线段数量等于 x 右边线段数量。

考虑离散化,将相同的端点散开,这样,一定会存在 x 左边线段数量等于 x 右边线段数量的点,且一定在离散化的端点上。

枚举离散化后一个端点 x,左边有 c1 条线段,右边有 c2 条线段,枚举一个在子集里的线段端点,钦定其产生贡献,分类讨论,则答案为:

li>xj1(c1j)(c21j1)2nc1c2lirixj1(c11j1)(c2j)2nc1c2=2nc1c2(li>xli(c1+c21c2)rixri(c1+c21c1))

扫一遍就好了,但是,对于一个子集,会有多个点使得他左右线段数量相等,一定是一段区间,考虑计数最小的那个点,即存在一个线段,其左端点或右端点为 x,这样当 x 继续减小时,会使左边的线段数 1,或右边的线段树 +1。容斥掉不选这个最小点的情况即可,妙!!!

509.B

fi,j 表示型号为 i 的机器人用 j 秒发的最多传单数量,显然一个机器人必然是先生成,再发传单。

考虑两种转移,生成新机器人即为 fi+1,jci+fi,jci,发传单即为 fi,j1+1

注意到我们生成一个机器人后,两个机器人至少可以发 2(jci) 张传单,不生成只能发 j 张传单,故当 2(jci)j 时我们一定生成,否则一定不生成,因为 2(jci)<jj<2ci,所以我们只能生成一次,并且新生成的机器人不能生成了,妙!!!!

这样根据 i,j 可以直接确定转移方向。

但是,我们的转移与 c 有关,并不能解决多次询问。

注意到 2(jci)j,即为 jc2i,于是我们将状态改为记录 k=jc,将答案表示为 gi,k×c+fi,k×(nmodc)

因为开始生成机器人的时刻 modc 同余,即 fi,k=j=kc+(jmodc)=kc+(nmodc),k<2i,于是我们分别记录这两项倒推即可,完全想不到啊!!!

考虑转移,k2i 时有 fi,k=fi,ki+fi+1,ki,gi,k=gi,ki+gi+1,ki,否则有 fi,k=1,gi,k=k

注意到生成一个型号 i 的机器人至少需要 i(i1)2 妙,所以 i 这一位记录到 O(n) 即可。

状态数是 O(nn),转移 O(1)

就是生成新机器人的时间一定是 c 的倍数,所以每个机器人发传单的时间同余 n mod c,而我们 dp 时只关心 n/c 的值,这样就能使 dp 与 n,c 无关。

妙妙啊!!!

510.复习组合数学之不相邻问题

n 个同类球放进 k 个不同盒子,可空,方案数为 (n+k1k1)

n 个球排成一列,从中取出 m 个不相邻的球,问有多少种解法。

相当于将 nm 个球分成 m+1 份,除了第一份和最后一份可以没有球,其他都要有一个球。考虑给中间 m1 份每份一个球,问题变为 nm(m1) 个球放入 m+1 个盒子,盒子可以没有球,或者说将 nm+2 个球放入 m+1 个盒子,盒子必须有球,方案数都为 (nm+1m)

n 个球排成一个环,从中取出 m 个不相邻的球,问有多少种解法。

随便考虑一个球,钦定他必须选,则他左右都不能选,变成一个 n3 的链问题,方案数为 (nm1m1)

再钦定他不能选,则变为 n1 个球的链问题,方案数为 (nmm)

所以总方案数为 (nmm)+(nm1m1)

511.P9195 [JOI Open 2016] JOIRIS

妙妙题。

好了这题的条件和 shenyang codeforces 都不同,应该区分。

先考虑模 k 意义下的序列 ai,使得所有数相等,发现列操作无影响,行操作就是对 [x,x+k) 加一。

考虑差分数组 di=aiai1,那么操作是 didi+1,di+kdi+k1,而终止条件是 i[2,n],di=0,记 br=imodk=rdi,有解充要条件是 r[0,k),r1modk,r(n+1)modk,br0(modk)。不用考虑 d1dn+1,因为我们可以将多余的数都往这些位置仍。

考虑构造操作 didi+v,di+kdi+kv,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|ifs,我们希望求出 |s|=i1fs,转移类似 fscs×gtfst,其中 cs 表示与 s 有交且不包含 s 的题目数量,gt 表示情况为 t 的题目数量,要求 0<|st|<s,故使用 |s|ifsg 做卷积后取出 |s|=i1 即为所求。

513.mx20D

问题可以变成我们可以成功排序所有 01 序列。

考虑这个 01 序列单峰或者单谷,分治,对 i[1,2k1],同时执行 F(i,i+2k1)

序列形如:

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,满足左边右边都至少有 k1

必要性,考虑最后一个操作,中间留下的数必须是 0

充分性:

设这个 0 的位置为 p,如果某一侧有 3k1,显然可以进行操作,最后两侧 1 个数 [k,3k),且两侧 1 总和只能为 2k4k,此时操作必须跨过两边。

若是 4k,那么直接操作,一定可以操作,就结束了,怎么是这样呢?》????

其实不用 3k 的操作也是可以的。

考虑容斥计算方案,减掉不合法的,设 x1 的个数,考虑首先有一个长度为 x 的全 1 串,往里面插入 nx0,我们发现 0 只能插在两边 k11 的两边,也就是只有 2k 个位置可以插,方案数为 (nx+2k12k1)

518.复习 CF441E、CF1864H

519.CF1943E2

非常妙的题!!!

这种最大最小博弈可以往二分答案变成胜负游戏的方向考虑。

于是二分答案 [0,lim],问题变为 Bob 能否清空某一个堆。

此时 Alice 就需要拿完 [0,lim] 所有堆中各一个,所以 Alice 的最优策略是每次拿次数最小的堆。

再考虑 Bob 的策略,没有发现。

考虑枚举 Bob 最后清空了的最小堆 j ,那么 Bob 显然不会去操作比他大的堆,因为 Bob 若要去操作比他大的堆,只有可能是将他们操作过来当替罪羊去凑轮数,那么不优于后面的问题,于是 Alice 也不会去操作后面的堆。

发现,Bob 不能操作成 aj<aj1,这样轮数减一了,非常不优,于是 Bob 最优操作先操作前面的,每次操作是进行 k 轮,目前有其它数的数量和目标的数量相同,那么先删和目标数量相同的数,再删目标。

简单判断一下可以通过简单版。

考虑优化判断过程,发现每次 Bob 取到的数会变成极差 1 的序列,若有 a 个数,和为 b,那么形态是固定的,用 (a,b) 表示这个状态,显然若 (a,b) 先手胜,那么 (a,b+1) 也是先手胜,可以固定 a 二分使得 (a,b) 合法的最小 b,因为这种序列情况下,每次 Alice 删除的堆的个数我是知道的!!,即 (a,b)(a1,bkab)

我们希望计算出一个 j,满足 Alice 操作完 [0,j] 后,剩余序列极差 1,这样就可以 O(1) 判断了。

考虑条件,我们发现,在最小的合法 j,满足在前 j+1 轮,Bob 的操作一定只会操作在 [j+1,t],这时候可以确定判断条件 stsj(j+1)ktjaj+1

于是我们假定所有 Bob 操作都在 [j+1,t],这样条件是单调的,可以二分出最小 j,简单证明这个最小 j 就是我们要求的,妙!

就做完了,时间复杂度 O(nlog2n),似乎可以双指针优化。

520.CF1930F

著名结论:a+b=(a|b)+(a&b)

maxx(maxva(v|x)minva(v|x))

固定产生 maxasminat

那么最优 x 的出的数应该是 as(asat)

我们发现答案就是两两 as,at 上面值的最大值,一定取到答案且合法,太脑筋急转弯了吧,应该记下来!!。

现在新加数 v,只需考虑 v 作为 as,at 带来的贡献即可。

前者是 max(v(vai))=vmin(vai)

按位贪心,只需知道是否有 ais 的子集,可以记搜

后者是 max(ai(vai))=max((v|ai)v),转化后变量单一,就能做了。

依旧是按位贪心。

521.ARC187D

分类讨论 c1 选择了 a1 还是 b1

ai,bi 在同侧,无用。

只需要考虑不同侧的对(这样左右就独立了!!!),确定左边最小值,那么比他小的都得选择右括号,可以维护一下前缀右括号最大值 当前值的最小值,插入就是后缀取 max,但是发现覆盖就行了。

还有正常做法。

枚举最小值,记 fi 表示最小值为 i 时最小的最大值,显然 fi 单调。

image

一样区间覆盖。

两个做法各有妙处。

522.CF2029I

发现重要结论 f(x)=i(xai)2,是二次函数,且最小值在 iain 取到。

于是我们枚举可能的 O(nm) 种平均数 x,计算 f(x) 操作若干次的最小值即可,这样方差和 ai 就独立了!!

问题变为:给定正整数 x,对恰好 i 个区间执行区间 +k 操作,求操作结束后 (aix)2 的最小值。

可以建出网络流:

  • 对于 1in+1idi,0 分别与 s,t 连边。
  • 对于 1in,1jmidi,0idi,j 连边 (1,(aix+jk)2(aix+(j1)k)2)idi,jidi+1,0 连边。

这样 idi,j 就表示这个点被加了多少次,为什么这样是对的呢,因为你发现平方的差分的单调递增的,所有最优的流一定先流 idi,j,再流 idi,j+1

考虑模拟费用流,找增广路:

  • s 到某个 idx,0,走正向边到 idy,0,x<y,相当于 [x,y1] 全部扩展一次。
  • s 到某个 idy,0,走反向边到 idx,0,x<y,然后走到 t,等价于反悔区间 [x,y1],减少一次。

直接模拟即可,时间复杂度 O(n2m2)

上面的 idi,0 其实有点问题,就是要拆成入点和出点。

523.CF1864H

期望进行次数可以转成对还没结束的局面概率求和,即数 <n 的概率求和。

n 自减,考虑让和 =n,在前面补上 δ,转成为操作序列 (δ,a0,a1,,aL),其中 L 表示钦定操作序列进行了 L×2,满足:

δ+Li=0ai2i=n2L

其中减去 2L 是因为开始的 1

妙妙转化, 变成 =,妙!

这样的操作序列的概率为 12L×12a

感觉是数位 dp 能干的事,记 bi,j 表示 ai 二进制下第 j 位,记 B=logn,有:

δ+2L+Li=02iBj=0bi,j2j=nδ+2L+Li=0Bj=0bi,j2i+j=nδ+2L+Bd=02dmin(L,d)i=0bi,di=n

其中 d=i+j,记 fd,j 表示 [2d]δ+min(L,d)i=0bi,di=j 的贡献之和,转移枚举 ibi,di 取值为 0/1 即可,计算贡献。

dpd,j 表示考虑到第 d 位,前面这一位进位了 j,枚举所有数的第 d 位值之和为 k,贡献为 dpd,j×fd,kdpd+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 的祖先,那么 dj 方向上的儿子的子树最大值等于 j,且 j 大于 i 的所有祖先。
  • ji 的祖先,则 ji 的祖先最大值。

妙妙,因为是计数前缀最大值序列,所以我们不会旁生分支,只考虑必经点。

还有编号限制,考虑用 BIT 维护,我们 dfsi,将 i 的所有祖先即祖先的非祖先儿子的 f 值加入,因为只有这些会转移到 i,并且可以继承。

vi 祖先编号最大值,则:

  • v>i,则 fi=0
  • 否则 fi=jBIT,vj<ifj

就做完了,时间复杂度 O(nlogn)

525.切割蛋糕(cake)

拆式子。

526.游乐园(park)

按照 aibi 从大到小排序,枚举分界点,前缀取 bik 大,后缀按照 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×(s11)×(s21)×

而我们对应 s 集合为前缀 min 的排列个数刚好也是这个,很对!

考虑会原来的 dag 上,钦定若干点是因子的 min,但是 dag 的拓扑序不好做。

不会了!!!!

似乎用拓扑序感性理解就很对!!!

考虑一个数的贡献概率,就是所有排列中满足它的因子的 min 的概率就是 1d(i)

所以答案就是 ni=11d(i)min25 筛即可。

posted @   蒟蒻orz  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示