11月记录

470.CF10E

不是很懂的题。

妙妙妙题!!!

调整归纳好!!

记钱 \(x\) 的贪心表示为 \(G(x)\),最小表示法为 \(M(x)\),那么始终有 \(G(x)\ge M(x)\)

我们要求最小的 \(w\),满足 \(G(w) > M(w)\)

\(G(x)\) 的子集也是贪心表示,\(M(x)\) 的子集也是最小表示,考虑反证。

由此,因为 \(w\) 最小,所以 \(G(w),M(w)\) 非零位无交,否则可以更小。

\(i,j\)\(M(w)\) 的最小最大非零位,严格降序。

结论:\(G(a_{i-1}-1)\)\(M(w)\)\(1,\cdots,j-1\) 位相同,第 \(j\) 位小一。

证明:

\(G(w)\)\(1\sim i-1\) 维一定有非零的,否则因为非零位无交,\(G(w)\)\(i\) 维为零,因为 \(M(w)\)\(i\) 维非零,故 \(w\ge a_i\),与贪心法矛盾,所以 \(w\ge a_{i-1}\)。(1)

因为 \(w\) 是最小的,所以 \(G(w-a_j)=M(w-a_j)\),因为 \(i\)\(M(w)\) 的最小非零位且 \(M(w)\)\(M(w-a_j)\) 的区别只有第 \(j\) 维差一,所以 \(M(w-a_j)\)\(i-1\) 维都是 \(0\)

\(G(w-a_j)=M(w-a_j)\) 得出 \(G(w-a_j)\)\(i-1\) 维都是 \(0\),所以 \(w-a_j<a_{i-1}\)。(2)

由 (1):\(a_{i-1}-1-a_i<w-a_i\),所以 \(G(a_{i-1}-1-a_i)<G(w-a_i)=M(w-a_i)\),两边都给第 \(i\) 维加一,得到 \(G(a_{i-1}-1)<M(w)\)

由 (2):有 \(w-a_j\le a_{i-1}-1\),则 \(G(w-a_j)\le G(a_{i-1}-1)\),所以 \(M(w-a_j)\le G(a_{i-1}-1)\)

所以,\(M(w-a_j)\le G(a_{i-1}-1)<M(w)\)

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

有没有可能 \(M(w)\) 的第 \(j\)\(-\) \(G(a_{i-1}-1)\) 的第 \(j\)\(\ge 2\) 呢?不可能,稍微玩玩就知道了。

471.CF2032

E

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

F

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

从后往前 dp\(f_{i,0/1}\) 表示考虑 \([i,n]\),最后一段是 nim 游戏还是反 nim 游戏,然后要求后面所有段最后都先手必胜的方案数。

注意到 nim 游戏和反 nim 游戏的胜负条件仅在 \(a_i\) 全为 \(1\) 时不同。

优化转移即可。

472.CF2028

E

先手必然往上走,后手必然拉他往下面走。

\(f_u\) 表示从 \(u\) 开始获胜的概率,那么有 \(f_u=\frac{f_{fa}+f_v}{2}\)

\(k_u,b_u\) 转移即可。

F

把序列分成若干段,问每段乘积之和是否可以 \(=m\)

注意到乘积只有 \(\log m\) 种,每种维护或和,可以做到 \(\mathcal O(\frac{n\log m}{w})\)

mx19

A

考虑按照左端点排序,考虑新加一个线段,若最早结束的可以选择这个线段,就选择,否则加入这个线段的右端点,替换掉最大的右端点,有点反悔贪心的味道。

\(m=1\),经典的线段覆盖问题!!就是按照右端点排序依次选择。

考虑扩展,每次判断能否选择即可,即每个点被覆盖的次数 \(\le m\)

B

\(f_{i,j}\) 表示到点 \(i\),在 dfs 序第 \(j\) 位方案数。

那么可以由父亲转移到儿子,稍微推一下转移就好了。

C

考虑一个数插入的贡献,相当于每次在大根笛卡尔树上,一个数的贡献就是顺着其所在的左/右链一直走走到拐弯为止的点的高度减去原数。

考虑从大到小插入,每次相当于插入到叶子上,假设 \(h_1<h_2<h_3<\cdots<h_n\),现在插入 \(h_i\),玩一玩发现,每种贡献都是可能的,即 \(h_{i+1}-h_i,h_{i+2}-h_i,\cdots ,h_n-h_i\)

bitset 优化背包即可。

D

image

mx20

A

一次复制后面跟着若干粘贴,对应序列 \(a_1,a_2,\cdots,a_k,a_i\ge 2\),那么个数是 \(\prod a_i\),代价是 \((x-y)k+y\sum_{i=1}^{k} a_i\)

显然 \(k\)\(\mathcal O(\log n)\) 级别,且显然不会存在某个 \(a_i,a_j\),满足 \(a_i\le a_j-2\),否则,小的变大一,大的变小一,总和不变,乘积变大,故序列 \(a\) 极差 \(<2\)

枚举 \(k\),设 \(a_i=t\)\(t+1\),分别枚举有 \(p\)\(t\)\(k-p\)\(t+1\),那么我们只需使得 \(t^p(t+1)^{k-p}>n\),找到最小的 \(t\),二分即可,时间复杂度 \(\mathcal O(\log^4 n)\)

B

简单题。

C

D

双栈模拟 deque

妙妙东西。

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

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

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

证明考虑设 \(k_i\) 为第 \(i\) 次重构时 deque 最大值的大小,\(q_i\) 为第 \(i-1\) 次重构到第 \(i\) 次重构之间加入的元素数量,那么有 \(k_i=\frac{k_{i-1}}{2}+q_i\),重构的总时间复杂度为 \(\mathcal O(\sum k_i)\),发现 \(q_i\)\(k_{i+j}\)\(\frac{q_i}{2^j}\) 的贡献,那么总时间复杂度是 \(\mathcal O(\sum q_i+\frac{q_i}{2}+\frac{q_i}{4}+\cdots)=\mathcal O(\sum q_i)\)

例题:CF2026F

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

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

用上面的技巧就行了。

[ARC176C] Max Permutation

首先连出边,建出图。

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

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

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

对于 \((u,v)\),显然 \(b_u,b_v\le c\),若 \(b_u<c\)\(b_v<c\) 那么这就确定了,所以只有 \(b_u=b_v=c\)

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

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

做完了。

[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\) 小的。

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

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

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

[ARC186E] Missing Subsequence

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

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

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

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

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

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

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

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

如果 \(i=m\)\(b_i=b_{i+1}\),就无需添加位置。

如果 \(b_i\ne b_{i+1}\),细节分析一下即可。

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

结尾可以新加 \(b_{m+1}=b_m\),卷 \(m\) 次,求出 \(f_{n+1}\) 就是答案。

[ARC186D] Polish Mania

开始写 atcoder 的题解了!!

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

  • \(\sum_{i}a_i=len-1\)
  • \(\forall i\in[1,n]\sum_{j=i}^{n}a_j\ge n-i\)

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

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

[ARC184C] Mountain and Valley Folds

折下纸应该可以发现。。

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

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

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

于是一个点是上凸的当且仅当 \(\lfloor\frac{x/lowbit(x)}{2}\rfloor\) 是奇数。

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

那么就是对一个子树加 \(1\)

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

[ARC184D] Erase Balls 2D

妙妙!

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

iaxzym1c

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

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

具体来说,就是对于选择的相邻的点 \(i,j\),不存在 \(x_i<x_k<x_j,y_i>y_k>y_j\),满足 \((i,k)\) 围成的矩形和 \((k,j)\) 围成的矩形包含的点与 \((i,j)\) 相同。

于是每次判断合法转移点转移即可,时间复杂度 \(\mathcal O(n^3)\)

[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]\leftarrow \sum_{p} \binom{r-l}{p-l}f(l,p-1)f(p+1,r)\)

就做完了。

[ARC183D] Keep Perfectly Matched

非常妙的题!!

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

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

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

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

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

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

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

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

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

做完了。

loj6564

妙妙题。

image

求值

不难改写第一类斯特林数 \(f_{i,j}=a_if_{i-1,j-1}+(i-1)f_{i-1,j}\)

于是 \(f(n)\) 的生成函数即为 \(\prod_{i=1}^{n}(a_ix+i-1)\)

妙妙结论!!!:有多项式 \(P,Q\) 和函数 \(c(F)=\gcd_{i}([x^i]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\),矛盾。

CF2029G Balanced Problem

类似题:CCPC final 2023 chengdu A.add one 2

判断一个序列 \(a\),能否由操作得出:对于 \(i\),若 \(a_i<a_{i+1}\),那么操作中一定由对 \(i+1\) 进行后缀加 \(a_{i+1}-a_i\) 次,\(a_i>a_{i+1}\) 同理,此时所有必要的操作进行完了,所有数都相等。

不妨设 \(a_0=a_{n+1}=M\),其中 \(M\) 为极大值,则 \(\sum_{i=0}^{n}\max(a_i-a_{i+1},0)=\sum_{i=0}^{n}\max(a_{i+1}-a_i,0)\)

条件为 \(a_0\ge \sum_{i=0}^{n}\max(a_i-a_{i+1},0),a_{n+1}\ge \sum_{i=0}^{n}\max(a_{i+1}-a_i,0)\)

两者相加,有 \(\sum_{i=0}^{n}|a_{i+1}-a_i|\le 2M\) 或者说 \(\sum_{i=1}^{n-1}|a_{i+1}-a_i|\le a_1+a_n\)

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

然后,相邻相等的元素可以合并,即一起操作,且 \(c_i\) 求和,则 \(|a_{i+1}-a_i|>0\),那么此时序列长度 \(\le a_1+a_n\le 2V\)

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

考虑选择若干个元素,将其通过操作提升到相同高度,设选择了 \(p_1,p_2,\cdots,p_k\),考虑能提升到的高度的最小值,同上,若 \(a_{p_i}<a_{p_{i+1}}\),则需要对 \(p_i\) 前缀加 \(a_{p_{i+1}}-a_{p_i}\) 次,稍微玩一玩发现,能提升的最小高度就是 \(a_{p_1}+\sum_{i=1}^{k}\max(a_{p_{i+1}}-a_{p_i},0)\),考虑添加 \(p_0=0\),就是 \(H=\sum_{i=0}^{k}\max(a_{p_{i+1}}-a_{p_i},0)\),美观度为 \(C=\sum_{i=1}^{k}c_{p_i}\)

这意味着 \(C\) 可以贡献给 \(\ge H\) 的所有 \(v\)

\(f_{i,j}\) 表示选择到 \(i\),提升高度的最小值为 \(j\),美观度的最大值,则:

\[f_{i,j}\leftarrow \max_{k=0}^{i-1}f(k,j-\max(a_i-a_k,0))+c_i \]

分别考虑 \(a_i\)\(a_k\) 的关系:

\[f_{i,j}=c_i+\max(f(k,j)[a_k>a_i],f(k,j-a_i+a_k)[a_k\le a_i])(0\le k<i) \]

从小到大枚举 \(i\),开 \(2V\) 个树状数组,对于前 \(V\) 个,第 \(j\) 个存所有 \(f(i,j)\),对于后 \(V\) 个,第 \(j\) 个存所有 \(f(i,j+a_i)\),容易转移,\(\mathcal O(V^2\log V)\)

妙妙,本质上是个二维偏序!!!


以下是做法 \(2\)

咕咕,还没看懂、、感觉挺自然的。

考虑 dp,枚举 \(v\) 并计算答案,设 \(f_{i,j,k}\) 表示前 \(i\) 个位置,有 \(j\) 次未结尾的前缀操作,\(k\) 次后缀操作,转移是,前缀操作可以选择一部分继承到下一个位置,剩下的结束,后缀操作必须继承到下一位,也可以在这个位置新开一些操作,发现当 \(j+k+a_v\ne v\) 时,最优策略一定是不改变 \(j,k\),因为这样留给后面更多操作空间,妙啊!!!因此转移为:

\[f_{i,j,k}\leftarrow f_{i-1,u,v}+c_i(j+k+a_i=v,u\ge j,v\le k)\\ f_{i,j,k}\leftarrow f_{i-1,j,k} \]

使用二维树状数组,时间复杂度 \(\mathcal O(V^3\log^2 V)\)

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

考虑改变 \(k\) 这维的意义,表示只考虑有 \(v-k\) 个后缀操作,那么需要转移的 \((j,k)\) 满足 \(j+a_i=k\)

每次找出这 \(\mathcal O(v)\) 个位置转移,\(v\) 的答案即为 \((0,0)\)\((v,v)\) 的矩形的最大值。

欧拉回路问题

欧拉路指的是:存在这样一种图,可以从其中一点出发,不重复地走完其所有的边的路径。

如果欧拉路的起点与终点相同,则称之为欧拉回路

显而易见,欧拉路存在的充要条件如下:

  • 图联通。
  • 对于无向图:有且仅有两个点,度数为奇数,其他点度数都是偶数;或所有点度数都是偶数。对于两个奇数点,一个为起点,一个为终点。起点需要出去,终点需要进入,故其必然与奇数个边相连。
  • 对于有向图:除去起点和终点,所有点的出度与入度相等。起点出度比入度大1,终点入度比出度大1。若起点终点出入度也相同,则为欧拉回路。

dfs 寻找欧拉回路,从起点开始,每次若一条边能走,就走,标记删除这条边,可以使用当前弧优化。

CF547D

将点看成连接其横坐标和纵坐标的边, 我们为每一条边定向, 使得每一个点的入度与出度的差的绝对值不超过 \(1\)

显然度数为偶数的点入度必须等于出度,而度数为奇数的点入出度恰好差 \(1\)

妙妙转化:我们将度数为奇数的点连边到虚拟点,由于度数为奇数的点必然有偶数个,于是对新图跑欧拉回路即可,必然有解,而有解可以构造出原问题的解。

CF429E

设红色边为区间 \(+1\),蓝色为 \(-1\),那么要求每个点绝对值 \(\le 1\),显然可以离散化。

若每个点覆盖次数都为偶数,那么显然等价于最终方案每个点都是 \(0\),即差分数组都是 \(0\),那么 \((l_i,r_i+1)\) 连双向边,要求每个点入度等于出度,跑欧拉回路即可。

否则,有奇数度数点,取出,\((A_{2i},A_{2i+1})\) 连边,这样可以使得每个点度数都是偶数,且原来奇数度数点有且仅有一条虚拟边,跑完欧拉回路,就会满足入度出度差绝对值 \(\le1\) 了。

求解

显然自由元很多,那么异或和为 \(0\) 的子集就很少,枚举一下判断即可。

直接从原序列上搞,有解就是 \(1\) 个数 \(\ge k\) 且连续段个数 \(\le k\)

求和

发现,若去掉只能交换 \(a_i,b_i\) 的条件,\(2n\) 个数可以任意排列。

权值显然是排序后,考虑每个数在另一个序列中比他小的个数要尽量小,发现最优解结构为 \(p_{2i-1}\)\(p_{2i}\) 不在同一个序列,这样一定能达到 \(\sum_{i=1}^{2n} p_i\times (n-\lfloor\frac{i}{2}\rfloor)\)

否则若存在 \(p_{2i-1},p_{2i}\) 在同一个序列,必然存在 \(p_{2j-1},p_{2j}\) 在另一个同一个序列,不妨设 \(i<j\),那么虽然 \(p_{2i}\) 变少了,但是 \(p_{2j}\) 变多了,不优,总能调整。

连边,表示这两个点颜色不同,假设有黑边 \((a_i,b_i)\),白边 \((p_{2i-1},p_{2i})\)

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


方法二。

image

CF2022D2

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

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

这样奇数是 \(n+1\),偶数是 \(n\)

似乎可以证明最优解 \(\ge n\)

\(n=3\) 时,不能优化,考虑 \(n\ge 5\)\(n\) 为奇数。

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

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

这样 \(n\ge 7\) 就最优了。

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

证明 \(n-1\) 次询问,不可能中找到内鬼。

image

MST

考虑 MST 的以下两个性质:

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

BEST 定理

对于一个欧拉图(有向图)而言,其以 \(x\) 出发,\(x\) 结束的欧拉回路的个数为 \(C\times du_x\prod _{u\in V} (du_u-1)!\),其中 \(C\) 为以 \(x\) 为根的根向树(叶向树也没问题,因为反正是欧拉图,每个点入度等于出度)的个数,\(du_u\) 表示 \(u\) 的出度。

证明:

考虑图的任意一棵根向树,对每个以 \(u\) 为起点的所有不在根向树上的 \(du_u-1\) 条出边钦定一个顺序,当然,根节点有 \(du_u\) 条出边。我们称这个根向树及这个出边的排列顺序为一个“组合”,显然我们需要证明两个部分:

  • 每个组合唯一对应一条欧拉回路。
  • 每条欧拉回路唯一对应一个组合。

先考虑第一个命题,我们考虑这样一个走法:从根节点开始,每到达一个节点,如果除了该节点与其在根向树上与父亲相连的边,其余边都被走过了,那么就沿着根向树上的边走向其父亲,否则就按照钦定的顺序走向下一条边。

显然这样每条边最多被访问一次,不过为什么这样走总可以得到一个欧拉回路呢?会不会走到一个地方走不下去了呢?

考虑反证法,假设走到某个点 \(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 必然有一条出边没有被访问,矛盾!因此每个组合唯一对应一条欧拉回路。

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

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

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

image

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

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

image

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

CF1919E

image

AT_arc187_c

\(P\to P'\) 显然是前缀 \(\max\) 做轮换。

\(P’\) 考虑就是选择若干个 \(P’_i\) 单调上升,且每一个 \(P’_i\) 是其所在段的最大值,发现其等价于 \(P’\) 的前缀最大值,即在前缀最大值中选择若干个,都满足条件,于是答案就是 \(2^{前缀 \max 个数 -1}\)

考虑对 \(P'\) 进行 dp,因为一个 \(P\) 唯一对应一个 \(P'\),将 \(Q\) 填充成若干 \(P’\),计算每个 \(P'\) 的方案求和,就是答案。

妙妙了。

\(f_{i,j}\) 表示考虑 \([1,i]\),前缀 \(\max=j\),发现如此记录竟能转移!!!!

因为当前位置在前缀 \(\max\) 不变的情况下的填数方案数是固定的,而这种情况下填什么数都没有影响,似乎和那道扩展 \(\max\),填 \(mex\) 的题很像!!!

P11291 【MX-S6-T3】「KDOI-11」简单的字符串问题 2

简单题,妙妙!

定义 \(g_i\) 为最大的 \(j\) 使得 \(T[l,j]\) 合法。

可以贪心求使得 \((l,r)\) 合法的最小 \(k\),即每次取已扩展的 \(\max g\) 扩展。

发现,定义 \(p_i\) 表示 \(j\in [i,g_i]\),使得 \(g_j\) 最大,那么扩展过程可以看作 \(i\to p_i\)\(k\) 次,妙妙!!!

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

小 H 的积木(jimuuu)

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

小 H 的树(tree)

sb 题。

小 H 的串(string)

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

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

第一种之前出现过了。

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

小 H 的蛋糕(cake)

\(tp=0\) 是简单的。

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

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

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

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

考虑 \(f_{i,k},k<p\) 转移到 \(f_{i+1,0}\) 的条件,就是选择了 \([x,i+1],x\le k\) 的区间进行覆盖,代价为 \(s_{i+1}-s_{x-1}-C\),选择前缀前缀和最小值转移即可。

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

时间复杂度 \(\mathcal O(n\log^2n)\)

a

容易推出式子为,有若干实数对 \((a_i,b_i)\),最小化 \(\sum_{i=1}^{n}\prod_{j=1}^{i-1}b_ja_i\)

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

b

随机化。

c

很妙的题。

等价于在一个双向的完全图上数 \(a\to b,b\to c,a\to c\) 且边权都相同的三角形。

考虑容斥,钦定某两条边颜色不同,于是只需要 \(in_{u,0/1},out_{u,0/1}\) 表示每条边入边颜色为 \(0/1\) 的边数,出边颜色为 \(0/1\) 的边数。

点分治容易计算。

对于钦定的两条边的交点进行计算即可。

防诈骗(game)

容易将去掉 \(lowbit\) 后相同的归一类,每一类是独立的,发现每一类其实就是个 \(nim\) 游戏,于是整个游戏的 \(SG(n)\)\(\oplus_{i=1}^{n}lowbit(i)\),观察 \(lowbit(i)\) 的函数后可以找出类似倍增的规律,即 \(SG(n)\) 只与 \(n\) 中的 \(1\) 有关,变成一个背包问题。

CF2030G2

考虑计算一个集合的权值,枚举交点 \(x\),并取最小值,即 \(\min_x \sum_{i=1}^{n}[r_i\le x](x-r_i)+[l_i>x](l_i-x)\),显然,若所有区间左右端点都不相同,那么这个值取最小当且仅当 \(x\) 左边线段数量等于 \(x\) 右边线段数量。

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

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

\[\sum_{l_i>x}\sum_{j\ge 1}\binom{c1}{j}\binom{c2-1}{j-1}2^{n-c1-c2}l_i-\sum_{r_i\le x}\sum_{j\ge 1}\binom{c1-1}{j-1}\binom{c2}{j}2^{n-c1-c2}\\ =2^{n-c1-c2}(\sum_{l_i>x}l_i\binom{c1+c2-1}{c2}-\sum_{r_i\le x}r_i\binom{c1+c2-1}{c1}) \]

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

B

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

考虑两种转移,生成新机器人即为 \(f_{i+1,j-ci}+f_{i,j-ci}\),发传单即为 \(f_{i,j-1}+1\)

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

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

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

注意到 \(2(j-ci)\ge j\),即为 \(\lfloor\frac{j}{c}\rfloor \ge 2i\),于是我们将状态改为记录 \(k=\lfloor\frac{j}{c}\rfloor\),将答案表示为 \(g_{i,k}\times c+f_{i,k}\times (n\bmod c)\)

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

考虑转移,\(k\ge 2i\) 时有 \(f_{i,k}=f_{i,k-i}+f_{i+1,k-i},g_{i,k}=g_{i,k-i}+g_{i+1,k-i}\),否则有 \(f_{i,k}=1,g_{i,k}=k\)

注意到生成一个型号 \(i\) 的机器人至少需要 \(\frac{i(i-1)}{2}\) 妙,所以 \(i\) 这一位记录到 \(\mathcal O(\sqrt n)\) 即可。

状态数是 \(\mathcal O(n\sqrt n)\),转移 \(\mathcal O(1)\)

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

妙妙啊!!!

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

\(n\) 个同类球放进 \(k\) 个不同盒子,可空,方案数为 \(\binom{n+k-1}{k-1}\)

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

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

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

随便考虑一个球,钦定他必须选,则他左右都不能选,变成一个 \(n-3\) 的链问题,方案数为 \(\binom{n-m-1}{m-1}\)

再钦定他不能选,则变为 \(n-1\) 个球的链问题,方案数为 \(\binom{n-m}{m}\)

所以总方案数为 \(\binom{n-m}{m}+\binom{n-m-1}{m-1}\)

P9195 [JOI Open 2016] JOIRIS

妙妙题。

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

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

考虑差分数组 \(d_i=a_i-a_{i-1}\),那么操作是 \(d_i\leftarrow d_i+1,d_{i+k}\leftarrow d_{i+k}-1\),而终止条件是 \(\forall i\in[2,n],d_i=0\),记 \(b_r=\sum_{i\bmod k=r}d_i\),有解充要条件是 \(\forall r\in[0,k),r\ne 1\bmod k,r\ne (n+1)\bmod k,b_r\equiv 0\pmod k\)。不用考虑 \(d_1\)\(d_{n+1}\),因为我们可以将多余的数都往这些位置仍。

考虑构造操作 \(d_i\leftarrow d_i+v,d_{i+k}\leftarrow d_{i+k}-v,v\in [0,k)\)

  • \(i\) 处加入 \(v\) 个横块,在 \([1,n]/[i,i+k)\) 处加入两个竖块,此时 \(v\) 个横块全部被消除,然后,\([1,n]/[i,i+k)\) 这些位置相对 \([i,i+k)\) 减少了 \(v\)

mx20 C

妙妙题!!

类似加权随机,观察到再问一遍无影响,于是概率等价于每次随机一个题目问,求变成 \(s\) 的概率和。

建出一个 \(2^n\) 的图,每个点的出边表示转移,注意需要处理自环,且每个点只会向子集转移,处理一下可以做到 \(\mathcal O(3^m)\)

类似子集卷积,按照位数从大往小做,处理出 \(|s|\ge i\)\(f_s\),我们希望求出 \(|s|=i-1\)\(f_s\),转移类似 \(\frac{f_s}{c_s}\times g_t\to f_{s\cap t}\),其中 \(c_s\) 表示与 \(s\) 有交且不包含 \(s\) 的题目数量,\(g_t\) 表示情况为 \(t\) 的题目数量,要求 \(0<|s\cap t|<s\),故使用 \(|s|\ge i\)\(f_s\)\(g\) 做卷积后取出 \(|s|=i-1\) 即为所求。

mx20D

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

考虑这个 \(01\) 序列单峰或者单谷,分治,对 \(i\in[1,2^{k-1}]\),同时执行 \(F(i,i+2^{k-1})\)

序列形如:

1111111111
1110001111

变成:

1110001111
1111111111

形如:

111000000
000001111

变成:

000000000
111001111

注意到两边都满足单峰或者单谷的条件,可以分治下去。

考虑一般 \(01\) 序列,假设左右两边都做好了排序,那么我们只需要将右边翻转,就变成单谷了!!!

套用单谷的分治即可!!

操作数为 \(F(n)=2F(\frac{n}{2})+G(n),G(n)=\frac{n}{2}+2G(\frac{n}{2})\)

妙妙!!

CF2038E

又是妙妙题!!!

显然是从后往前,每个位置加 \(h_i\) 的水量,使得平衡后,切割这个位置的水。

考虑维护若干连续段,满足这些连续段水量相等,且加水之后,需要平均分。

考虑加水操作,实际上会跳过后缀若干段,这些段水位与左边管道齐平,找到第一个不满足的段,进行操作,若操作完这个段后水位与右边管道齐平,就与右边段合并。

CF1967D

可以二分答案,并且可以双指针判断,即看 \(a_1\) 是否能到 \(1\),若不能,则看是否能到 \(2\),如果能,\(a_2\) 就只需从 \(2\) 开始判断。

于是问题转化为 \(\mathcal O(m\log m)\) 次判断一个点能否到达一个点。

CF1936D

一次询问考虑分治,双指针计算跨过中点的区间贡献,注意到前后缀或只有 \(\mathcal O(\log V)\) 个,于是单次计算复杂度 \(\mathcal O(\log V)\)

考虑套到线段树上,就做完了。

CF1930E

被薄纱。。。

考虑计数最终序列,\(1\) 表示被删除,\(0\) 表示留下。

有结论:序列合法当且仅当 \(1\) 个数为 \(2k\) 的倍数,且存在一个 \(0\),满足左边右边都至少有 \(k\)\(1\)

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

充分性:

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

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

其实不用 \(\ge 3k\) 的操作也是可以的。

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

复习 CF441E、CF1864H

CF1943E2

非常妙的题!!!

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

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

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

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

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

发现,Bob 不能操作成 \(a_j<a_{j-1}\),这样轮数减一了,非常不优,于是 Bob 最优操作先操作前面的,每次操作是进行 \(k\) 轮,目前有其它数的数量和目标的数量相同,那么先删和目标数量相同的数,再删目标。

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

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

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

考虑条件,我们发现,在最小的合法 \(j\),满足在前 \(j+1\) 轮,Bob 的操作一定只会操作在 \([j+1,t]\),这时候可以确定判断条件 \(\lfloor\frac{s_t-s_j-(j+1)k}{t-j}\rfloor\le a_{j+1}\)

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

就做完了,时间复杂度 \(\mathcal O(n\log^2 n)\),似乎可以双指针优化。

CF1930F

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

\[\max_x(\max_{v\in a}(v | x)-\min_{v\in a}(v|x)) \]

固定产生 \(\max\)\(a_s\)\(\min\)\(a_t\)

那么最优 \(x\) 的出的数应该是 \(a_s-(a_s\and a_t)\)

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

现在新加数 \(v\),只需考虑 \(v\) 作为 \(a_s,a_t\) 带来的贡献即可。

前者是 \(\max(v-(v\and a_i))=v-\min(v \and a_i)\)

按位贪心,只需知道是否有 \(a_i\)\(s\) 的子集,可以记搜

后者是 \(\max(a_i-(v\and a_i))=\max((v|a_i)-v)\),转化后变量单一,就能做了。

依旧是按位贪心。

ARC187D

分类讨论 \(c_1\) 选择了 \(a_1\) 还是 \(b_1\)

\(a_i,b_i\) 在同侧,无用。

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

还有正常做法。

枚举最小值,记 \(f_i\) 表示最小值为 \(i\) 时最小的最大值,显然 \(f_i\) 单调。

image

一样区间覆盖。

两个做法各有妙处。

CF2029I

发现重要结论 \(f(x)=\sum_{i}(x-a_i)^2\),是二次函数,且最小值在 \(\frac{\sum_{i}a_i}{n}\) 取到。

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

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

可以建出网络流:

  • 对于 \(1\le i\le n + 1\)\(id_{i,0}\) 分别与 \(s,t\) 连边。
  • 对于 \(1\le i\le n,1\le j\le m\)\(id_{i,0}\)\(id_{i,j}\) 连边 \((1,(a_i-x+jk)^2-(a_i-x+(j-1)k)^2)\)\(id_{i,j}\)\(id_{i+1,0}\) 连边。

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

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

  • \(s\) 到某个 \(id_{x,0}\),走正向边到 \(id_{y,0},x<y\),相当于 \([x,y-1]\) 全部扩展一次。
  • \(s\) 到某个 \(id_{y,0}\),走反向边到 \(id_{x,0},x<y\),然后走到 \(t\),等价于反悔区间 \([x,y-1]\),减少一次。

直接模拟即可,时间复杂度 \(\mathcal O(n^2m^2)\)

上面的 \(id_{i,0}\) 其实有点问题,就是要拆成入点和出点。

CF1864H

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

\(n\) 自减,考虑让和 \(=n\),在前面补上 \(\delta\),转成为操作序列 \((\delta,a_0,a_1,\cdots,a^{L})\),其中 \(L\) 表示钦定操作序列进行了 \(L\)\(\times 2\),满足:

\[\delta+\sum_{i=0}^{L}a_i2^i=n-2^L \]

其中减去 \(2^L\) 是因为开始的 \(1\)

妙妙转化,$\le $ 变成 \(=\),妙!

这样的操作序列的概率为 \(\frac{1}{2^L}\times \frac{1}{2^{\sum a}}\)

感觉是数位 dp 能干的事,记 \(b_{i,j}\) 表示 \(a_i\) 二进制下第 \(j\) 位,记 \(B=\log n\),有:

\[\delta+2^L+\sum_{i=0}^{L}2^i\sum_{j=0}^{B}b_{i,j}2^j=n\\ \delta+2^L+\sum_{i=0}^{L}\sum_{j=0}^{B}b_{i,j}2^{i+j}=n\\ \delta+2^L+\sum_{d=0}^{B}2^d\sum_{i=0}^{\min(L,d)}b_{i,d-i}=n \]

其中 \(d=i+j\),记 \(f_{d,j}\) 表示 \([2^d]\delta+\sum_{i=0}^{\min(L,d)}b_{i,d-i}=j\) 的贡献之和,转移枚举 \(i\)\(b_{i,d-i}\) 取值为 \(0/1\) 即可,计算贡献。

\(dp_{d,j}\) 表示考虑到第 \(d\) 位,前面这一位进位了 \(j\),枚举所有数的第 \(d\) 位值之和为 \(k\),贡献为 \(dp_{d,j}\times f_{d,k}\to dp_{d+1,\frac{j+k}{2}}\),需要保证 \(j+k\) 进位后剩下值等于 \(n\) 的第 \(d\) 位。

妙啊!!!

CF1930G

显然是考虑相邻前缀最大值转移,记 \(f_i\) 表示以 \(i\) 结尾的序列数量。

考虑寻找转移顺序。

判断一个点是前缀最大值:

  • 它的所有祖先编号小于它。
  • 之前 dfs 过的祖先的儿子(不是一个祖先)子树 \(\max\) 小于它。

那么考虑将一个点的所有儿子按照子树 \(\max\) 升序排序,获得一个 dfs 序,那么以 \(i\) 结尾的序列中的值都在 \([1,dfn_i]\) 中,给了我们一个很好的转移顺序,因为编号并不好考虑,但很好处理,然后我们可以跑一遍这个 dfs 序,这样到 \(i\) 时跑过的点就是 \([1,dfn_i]\) 了,边 dfs 边计数。

考虑上一个前缀最大值 \(j\) 转移到 \(i\) 的条件,有 \(j<i,dfn_j<dfn_i\),设 \(d=\operatorname{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\),则 \(f_i=0\)
  • 否则 \(f_i=\sum_{j\in BIT,v\le j<i} f_j\)

就做完了,时间复杂度 \(\mathcal O(n\log n)\)

切割蛋糕(cake)

拆式子。

游乐园(park)

按照 \(a_i-b_i\) 从大到小排序,枚举分界点,前缀取 \(b_i\)\(k\) 大,后缀按照 \(a_i\) 从小往大取,能取就取,bit 上二分即可。

有根树(tree)

写过了。

集合操作(set)

妙妙题。

\(u\) 向他的所有倍数连边,形成一张 DAG

我们考虑给每个点赋一个排列,表示操作时间,如果一个点的权值是他的因子的最小值,那么表示他被操作了。

\(f(p)=\sum_{i=1}^{n}[\min_{d|i}p_d=p_i]\),我们尝试说明 \(\sum_{p} f(p)=n!\times ans\)

对于原题,停止后剩下 \(s\) 个元素的贡献概率为 \(\frac{s!}{n!}\)

考虑拎出一条倍数链,\(a_1,a_2,\cdots a_k\),定义下标集合 \(s\) 表示被操作过的下标,那么原题的贡献概率为 \(\frac{1}{n\times (s_1-1)\times (s_2-1)\times \cdots}\)

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

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

不会了!!!!

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

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

所以答案就是 \(\sum_{i=1}^{n}\frac{1}{d(i)}\)min25 筛即可。

posted @ 2024-11-04 20:44  蒟蒻orz  阅读(16)  评论(0编辑  收藏  举报