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
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**i 为 i 号点的度数。
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
妙妙!
数剩下球的集合似乎不太好做,考虑选择的球的集合。
如上,圆点表示选择的点,那么留下来的点就是红条覆盖的地方。
但是这样会算重,就是一种留点方案可能有不同的操作方法,显然这些操作方法互相包含,一定有一个全集,使得再操作了这个全集后,操作任意点都会改变红条。
具体来说,就是对于选择的相邻的点 \(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
妙妙题。
求值
不难改写第一类斯特林数 \(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\),美观度的最大值,则:
分别考虑 \(a_i\) 和 \(a_k\) 的关系:
从小到大枚举 \(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\),因为这样留给后面更多操作空间,妙啊!!!因此转移为:
使用二维树状数组,时间复杂度 \(\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})\)。
可以证明图一定是二分图,每个点都有且仅有一条黑出边和白出边,若存在奇环,那么必有一个点拥有两条颜色一样的出边,矛盾,故原图是二分图,妙妙!!
方法二。
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\) 次询问,不可能中找到内鬼。
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\) 号点的一条出边为第一条访问边。
问题: 给定 \(n\) 个节点 \(m\) 条边的有向半欧拉图,求欧拉路径数。
解法: 将该图添加一条有向边变成欧拉图,新图的欧拉回路和原图的欧拉路径构成双射,用 BEST 定理计算即可。
似乎 BEST 定理也能计算欧拉路径数量,在半欧拉图上。
CF1919E
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)
对于这种进行若干操作得到一个结果,并要求本质不同结果的题。
一种想法是对操作去重,另一种想法是对合法结果计数,也就是 dp
套 dp
。
第一种之前出现过了。
贪心不好判断合法,发现可以 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\) 条线段,枚举一个在子集里的线段端点,钦定其产生贡献,分类讨论,则答案为:
扫一遍就好了,但是,对于一个子集,会有多个点使得他左右线段数量相等,一定是一段区间,考虑计数最小的那个点,即存在一个线段,其左端点或右端点为 \(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\) 为 \(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\) 单调。
一样区间覆盖。
两个做法各有妙处。
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\),满足:
其中减去 \(2^L\) 是因为开始的 \(1\)。
妙妙转化,$\le $ 变成 \(=\),妙!
这样的操作序列的概率为 \(\frac{1}{2^L}\times \frac{1}{2^{\sum a}}\)。
感觉是数位 dp
能干的事,记 \(b_{i,j}\) 表示 \(a_i\) 二进制下第 \(j\) 位,记 \(B=\log 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
筛即可。
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18526206