Codeforces试题乱做 Part7

恭喜泽少免费了 /qq .


\(\text{[CF1144G]Two Merged Sequences}\)

\(\color{green}{\text{[EASY]}}\)

差点不会做了.

不难发现两个序列只有一个交点, 于是单调栈, 如果一个序列不能满足就丢到另一个序列, 两个都不能满足就找到交点了, 枚举一下交点属于那个序列即可.

时间复杂度 \(\mathcal{O}(n)\) .


\(\text{[CF464E]The Classic Problem}\)

\(\color{green}{\text{[EASY]}}\)

我应该会的 /kk .

显然还是最短路, 考虑到二进制的特殊性, 线段树维护加法, 哈希和比较 \(lcp\) 后的数来判断大小, 主席树即可.

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


\(\text{[CF793F]Julia the snail}\)

\(\color{green}{\text{[EASY]}}\)

首先看到每个 \(r\) 互不相同, 所以我们可以从左到右暴力的判断每个点是否能到.

进一步考虑优化暴力, 考虑分块.

\(f_{i,j}\) 表示考虑从点 \(i\) 开始到块 \(j\) 的区间最远能到哪, 并且可以走很多步, \(g_{i,j}\) 表示考虑从点 \(i\) 开始到块 \(j\) 的区间最远能到哪, 只能走一步.

\(f\) 的时候单调栈即可.

时间复杂度 \(\mathcal{O}(n)\) .


\(\text{[CF1720D2]Xor-Subsequence (hard version)}\)

\(\color{green}{\text{[EASY]}}\)

不难发现可以类似求最长上升子序列一样列出式子, 考虑优化, 既然是异或, 考虑拆位.

我们发现, 若 \(a_i\oplus j\)\(a_j\oplus i\) 的前 \(k-1\) 位完全相同, 则 \(a_i\oplus i\)\(a_j\oplus j\) 的前 \(k-1\) 位也完全相同.

若此时后者小于前者则是合法转移, 继续探索性质, 设 \(i\) 的第 \(k\) 位为 \(u\) , \(a_i\) 的第 \(k\) 位为 \(v\) , \(j\) 的第 \(k\) 位为 \(w\) , \(a_j\) 的第 \(k\) 位为 \(x\) , 则有 \(u\oplus x=0<1=v\oplus w\) , 进一步可以得到 \(w=v\oplus 1,u=x\) .

于是就不难想到丢到 \(01trie\) 上就做完了, 时间复杂度 \(\mathcal{O}(\sum{n\log{\max\{n,\max\{a_{i}\}\}}})\) .


\(\text{[CF1721F]Matching Reduction}\)

\(\color{blue}{\text{[NORMAL]}}\)

首先猜测是只能删一个点, 考虑证明, 因为最大匹配数等于点集大小减最大独立集, 所以一定是删非最大独立集里的一个点.

考虑一个匹配边, 一定有一个端点有增广路, 另一个没有, 那就只能删有增广路的那个点, 标记一下即可.

网络流解决.


\(\text{[CF1691F]K-Set Tree}\)

\(\color{green}{\text{[EASY]}}\)

dx 都会的题我怎么可能不会嘛.

考虑每个点作为 \(lca\) 的贡献再换根 \(dp\) 就好了, 时间复杂度 \(\mathcal{O}(n)\) .


\(\text{[CF896E]Welcome home, Chtholly}\)

\(\color{blue}{\text{[NORMAL]}}\)

第二分块模板题, 处理区间给大于 \(x\) 的数减 \(x\) , 查询等于 \(x\) 的数的问题.

考虑分块, 每个块内维护内部值域位置以及个数, 并查集维护.

修改时散块暴力重构, 整块打标记, 维护区间最大值与区间移动标记.

如果 \(2x > Max\) , 那我们枚举 \([x+1,Max]\) , 暴力修改, 这样每次修改不超过 \(x\) 次, 每次 \(Max\) 减少了 \(x\) .

如果 \(2x\leqslant Max\) , 那么将 \([1,x]\) 暴力移动到 \([x+1,2x]\) 上, 相当于区间平移了 \(x\) .

时间复杂度 \(\mathcal{O}(n\sqrt{n})\) .


\(\text{[CF1616H]Keep XOR Low}\)

\(\color{green}{\text{[EASY]}}\)

把所有数放进 \(01trie\) 里, 然后 \(dp\) , 时间复杂度 \(\mathcal{O}(n\log{n})\) .


\(\text{[CF1503E]2-Coloring}\)

\(\color{blue}{\text{[NORMAL]}}\)

其实挺简单的.

考虑最后的形态会是什么样, 蓝黄的连通块一个是一整个连通块, 另一个是两个单峰.

以其中一种为例,

\[2\sum_{h=1}^{m-1}{\sum_{i=1}^{n-1}{\sum_{j=i+1}^{n}{\binom{i-1+h}{h}\binom{n-i+h-1}{h-1}\binom{j+m-h-2}{m-h-1}\binom{n-j+m-h}{m-h}}}} \]

另一种类似, 其中一个长度为 \(n\) 的单调不升的序列且第一个数为 \(y\) 的方案数是 \(\binom{x+y}{x}\) , 插板法, 先加 \(x\) 个数变成是严格递减.

式子可以前缀和优化, 时间复杂度 \(\mathcal{O}(n^2)\) .


\(\text{[CF241B]Friends}\)

\(\color{green}{\text{[EASY]}}\)

把所有数从小到大排序, 扔到 \(01trie\) 树里, 不难求出第 \(k\) 大的异或值, 比第 \(k\) 大的异或值大的一定是与其某个前缀相同, 接着一位为 \(1\) , 剩下的任意.

分每位求即可, 因为排序了, 所以 \(01trie\) 树上的一棵子树对应一个区间.

时间复杂度 \(\mathcal{O}(n\log{V})\) .


在不知不觉中完结了.

posted @ 2022-09-26 21:07  Lonely923  阅读(37)  评论(0编辑  收藏  举报