syxqwq

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

CF1510C Cactus Not Enough

定义一张无向图为仙人掌,当且仅当这张图连通,没有重边和自环,且图中所有的边都在至多一个简单环中。

定义一个仙人掌是强的,当且仅当在这个仙人掌中加入任意一条边得到的图都不是仙人掌。

给定一张 \(n\) 个点 \(m\) 条边的仙人掌,问至少加入多少条边才能让这个仙人掌变得强,并输出方案。

\(1 \leq n \leq 10^5, 0 \leq m \leq 10^5\)

Solution

仙人掌问题,考虑建出圆方树。

不难发现,当一个点双 \(\geq 3\) 时候,我们对它加边一定是不合法的,所以只剩下了大小 \(=2\) 的点双。

所以圆方树是假的,只保留同一点双之间的那些边之后是一个森林。

考虑什么情况才可能加一条边还是仙人掌,当一条路径跨越了 \(\geq 2\) 个点双才会。原题转化为选若干条路径,使得每个点的邻边至多有一条没被选择。树形 dp 即可。

挂了。懒得调。https://www.luogu.com.cn/record/227970440

CF1874D Jellyfish and Miku

Jellyfish 从 \(0\) 开始,每次有 \(\dfrac{a_i}{a_{i}+a_{i+1}}\) 的概率走到 \(i-1\)\(\dfrac{a_i+1}{a_{i}+a_{i+1}}\) 走到 \(i+1\),可以随意构造 \(a_i\),但要求 \(\sum a_i=m\),求期望走到 \(n\) 最小步数。

\(1 \leq n \leq m \leq 3000\)

Solution

考虑暴力推柿子,设 \(f_i\) 表示从 \(i\) 走到 \(n\) 的期望,则有:

\(f_0=1,f_i=\dfrac{a_i}{a_i+a_{i+1}}f_{i-1}+\dfrac{a_{i+1}}{a_i+a_{i+1}}f_{i+1}+1,f_n=0\)

化简得 \(a_i(f_{i-1}-f_i)+a_{i+1}(f_{i+1}-f_i)+a_i+a_{i+1}=0\)

不妨设 \(g_i=f_{i-1}-f_i\),那么 \(a_ig_i-a_{i+1}g_{i+1}+a_i+a_{i+1}=0\)

化简得 \(g_i=\dfrac{a_{i-1}(g_{i-1}+1)}{a_i}+1\)

暴力展开 \(g_i\) 直到 \(g_1=1\),发现常数都变成了 \(2\),所以 \(g_i=\dfrac{2\sum_{j=1}^{i-1}a_j}{a_i}+1\)

显然我们所求 $f_0=\sum g_i = n+\sum_{i=1}^n \dfrac{2\sum_{j=1}^{i-1}a_j}{a_i} $。

好做的。可以直接对于 \(i\) 枚举 \(sum_{i-1}\)\(a_i\),这样是 \(O(nm^2)\) 的。

注意到 \(a_i>a_j(i<j)\) 时,会有产生一个 \(\frac{a_i}{a_j}>\frac{a_j}{a_i}\),所以一定不优,\(a_i\) 从小到大就相当于给后面都加了一个 \(\geq a_i\) 的限制,那么直接枚举变成了调和级数复杂度。

总复杂度 \(O(nm \ln m)\)Submission #331723893 - Codeforces

CF193D Two Segments

给定一个 \(1 \sim n\) 的排列,在这个排列中选出两段互不重叠的区间,求使选出的元素排序后构成公差为 \(1\) 的等差数列的方案数。选出的两段区间中元素构成的集合相同时视为同一种方案。\(1\leq N\leq3\times10^5\)

Solution

考虑“选出的两段区间中元素构成的集合相同时视为同一种方案”这一限制,这启示我们只关心值域。

显然可以枚举一段值域的右端点,那么我们只需要对于 \(l\in[1,r)\)\(r-1\) 个左端点,查询可以被分为 \(\leq 2\) 段的端点个数。

不难发现,当我们加入某个数的时候,本质上是合并了相邻的几个块,直接对于 \(a_{p_i+1}\)\(a_{p_i-1}\) 之前的区间 \(-1\) 即可。

用线段树维护段数,复杂度 \(O(n \log n)\)Submission #331958865 - Codeforces

CF1592F1 Alice and Recoloring

给定一个 \(n\)\(m\) 列的目标矩阵,矩阵元素只有 W 或 B ,并且你有一个初始矩阵,元素全为 W 。

现在你可以矩阵实施以下操作:

  1. 使用一块钱,选定一个包含 \((1,1)\) 的子矩阵,把矩阵中的元素全部反转( W 变 B , B 变 W )。
  2. 使用两块钱,选定一个包含 \((n,1)\) 的子矩阵,把矩阵中的元素全部反转。
  3. 使用四块钱,选定一个包含 \((1,m)\) 的子矩阵,把矩阵中的元素全部反转。
  4. 使用三块钱,选定一个包含 \((n,m)\) 的子矩阵,把矩阵中的元素全部反转。

现在需要你求出把初始矩阵变为目标矩阵最少需要几块钱。

\(n,m\leq 500\)

Solution

幽默题。需要人类智慧。

操作二三是招笑操作,不难证明都不优于两次操作一。

然后正难则反,倒着做,改成从目标矩阵到初始矩阵。

考虑一次操作的是一个矩阵,容易想到进行差分变成单点改。

但是差分的形式非常丑陋,甚至不能确定奇偶性,我们考虑每个点只管辖一定的区间。

这样子我们就可以定义 \(s_{i,j}=a_{i,j}\operatorname{xor}a_{i,j+1}\operatorname{xor}a_{i+1,j}\operatorname{xor}a_{i+1,j+1}\)。最后满足条件就是 \(s\) 均为 \(0\)\(a_{n,m}=0\)

然后重新定义操作一和操作四,发现操作一只会修改右下角的答案,操作四会修改除了右下角的答案。

又发现,如果做了两次的操作四,会改变六个点,此时做六次操作一是等价的,所以操作四最多只会被执行一次。

贪心做就行。

CF1592F2

在 F1 的基础上把操作四改成了两块钱。

Solution

继续 F1 的思路,一次操作四会影响 \(3\) 个位置,但是存在某个 \(x_i=x_j\)\(y_i=y_j\) 时只会影响四个,这时与四次操作一等价。

此外,当三个位置中有至少一个为 \(0\) 时,此时不优于做三次操作一。

于是求二分图最大匹配消掉最多的 \(1\),剩下的 \(1\) 都由操作一做。

网络流求最大匹配可以做到 \(O(n^2\sqrt n)\)Submission #333894650 - Codeforces

CF1214F Employment

\(1\sim m\) 的环,\(n\) 个人初始坐标 \(b_i\),另有 \(n\) 个位置标号 \(a_i\),每个位置都要有人,求移动距离之和最小值。

\(1 \leq m \leq 10^9, 1 \leq n \leq 2 \times 10^5\)

Solution

\(a_i,b_i\) 分别排序,显然答案一定是 \(a_{x+i}\)\(b_i\) 进行配对,\(x\) 是选定的一个值。

那么 \(O(n^2)\) 暴力显然。

考虑我们记 \(ans_x=\sum_{i=0}^{n-1} |a_i-b_{i+x}|\)。分别把 \(a_i,b_{i+x}\) 绝对值拆开。

\(a\)\(b\) 领出来单独看,那么 \(suma_x-suma_{x-1}\) 是只关于每个 \(a_i\) 的式子,每个 \(a_i\) 的贡献,只会是 \(0\)\(-2a_i\),具体关于 \(b\) 的大小。

然后再去扫 \(b\) 的一维,\(b_i\) 会在某个 \(x\) 之后才会对答案有正的影响,于是也能差分。

\(O(n \log n)\)Submission #333929642 - Codeforces

CF30E Tricky and Clever Password

一个长度为奇数的回文串可以写成 \(a+b+a′\) 的形式(\(a\) 可以为空),其中 \(a′\)\(a\) 的反串。现在将它加密成 \(S\),变成了 \(x+a+y+b+z+a′\) 的形式,给出 \(S\),求最长可能的原串。

\(1 \leq |s| \leq 10^5\)

Solution

简单题,一眼秒了。

首先这个 \(b\) 是独立的一段,肯定有贪心是想让他越长越好,不妨枚举 \(b\) 的中心的那个位置,每次想办法求出他能扩展到哪个位置。

你发现 \(b\) 是一个回文串嘛,那就是中间分开两半对称,把 \(S\) 正反拼一起求个 sa 算 lcp 就好了。

现在问题变成了找到 \(a\)。观察到 \(a'\)\(S\) 的后缀。我们不妨对于每个 \(a'\) 都在 \(S\) 找到 \(a\) 第一次出现的位置(后面出现显然不会比第一次优),发现这个位置是逐渐向右走的,双指针预处理即可,找的时候可以二分。

于是时间复杂度 \(O(n \log n)\)Submission #334037778 - Codeforces

CF815E Karen and Neighborhood

一个 \(1\sim n\) 的街巷,每个人都会依次选择目前已经有人的所有房间最短距离最大的那个房子入住。

求第 \(k\) 个人入住的位置。\(1 \leq k \leq n \leq 10^{18}\)

Solution

巨困难啊这题!!!11

首先我们进行前两次操作把两个边界填满。

发现一个 \(n\) 可能会被分为两个相同的数或是一个奇数一个偶数。

我们把分解 \(n\) 的大致过程画出来。发现每一层最多只会有两个不同的数,他们相邻。

然后是不是就很能二分确定第 \(k\) 个人所在空格的长度 \(x\) 了!!!11

然后我们再从 \((1,n)\) 开始递归,每次从中间点分割,显然也可以同理上述操作确定 \([l,mid]\)\(x\) 的个数和 \([mid+1,r]\)\(x+1\) 的个数,仅当 \(k \leq\) 这么多时会走到左儿子。

这么模拟直到 \(k=1\),然后你就知道答案了。复杂度 \(O(\log^3 n)\)

Submission #334071931 - Codeforces

CF2077E Another Folding Strip

定义 \(f(b)\) 为,每次选择一个序列 \(p\),其中 \(p_i < p_{i+1}\) 且不存在一个 \(i\) 满足 \(p_i \equiv p_{i+1} \pmod 2\),将 \(b_{p_i} \gets b_{p_i}-1\),使 \(b_i\) 置为全零的最小次数。

现给定 \(a\),求 \(\sum_{l=1}^n\sum_{r=l}^n f(a_l\sim a_r)\)

\(1 \leq n \leq 2 \times 10^5\)

Solution

显然有将奇偶性分开来考虑,这样子你就可以对于每个 \(l\) 分别记录 \(f_{0/1}\) 表示上一个位置奇偶情况是 \(0/1\) 还遗留了几个。然后发现每次增量其实是一定的,直接线段树维护可以做到 \(O(n \log n)\)

\(O(n)\) 做法看上去非常牛,我来阅读理解一下。

还是考虑 \(f(b)\) 的形式,我们把 \(b_i\) 拆成 \(b_i\) 个点,左边是入点,右边是出点,每次相当于是把左边小于右边且奇偶性不同的点匹配。于是操作次数为 \(\sum b_i - \texttt{match}\)

使用 ex-Hall 定理的结论 \(\texttt{match}=|L|-\max_{S\subseteq L}\{|S|-|N(S)|\}\)

你观察这个连边,是很有特征的,\(N(S)\) 的只取决于 \(S\) 中最大的奇数和偶数的 \(A,B\)(我们钦定 \(A\) 是更大的数),其他更小的数连出去的边一定被 \(A\)\(B\) 其中之一包含。

显然有 \(S = \{i|i\leq B\} \cup \{i|B<i\leq A \land i \equiv A \pmod 2\}\)

因此,\(N(S) = \{i|i\leq B\} \cup\{i|B<i\leq A \land i \equiv B\pmod 2\}\)

原题 \(f\) 即求 \(\begin{aligned}\max_{A>B\land A\not\equiv B\pmod2} \{\sum_{B<i\leq A\land i\equiv A \pmod 2} a_i - \sum_{B<i\leq A\land i\equiv B \pmod 2} a_i \}\end{aligned}\)

其实他是一个相同奇偶性加起来减另一个奇偶性的的加和的形式,我们定义 \(b_i=b_{i-1}+ \left \{\begin{aligned} a_i,i\bmod 2=1 \\ -a_i,i\bmod2=0\end{aligned} \right.\)

于是 \(f(l,r)=\begin{aligned}\max_{i=l-1}^rb_i-\min_{i=l-1}^r b_i\end{aligned}\)

很能单调栈算出来每个 \(b_i\) 管辖的最大最小值区间。然后做完了。

复杂度 \(O(n)\)Submission #334145676 - Codeforces

CF930E Coins Exhibition

\(k\) 枚硬币,\(n\) 个限制说 \([l_i,r_i]\) 中至少有一个硬币正面朝上,\(m\) 个限制说 \([l_i,r_i]\) 中至少有一个反面朝上。

求合法的摆放总数 \(\bmod 10^9+7\)

\(1 \leq k \leq 10^9\)\(1 \leq n,m \leq 10^5\)

Solution

显然有朴素 dp,\(f_{i,j,0/1}\) 表示 \(i\) 填了 \(0/1\),上一个异色在 \(j\) 的方案数。转移显然。

但是复杂度 \(O(k^2)\),很不能接受,考虑离散化呢?

对于一般情况转移有 \(f_{i+1,j,0}\gets f_{i,j,0},f_{i+1,j,1}\gets f_{i,j,1}\)

而由于 \(i+1\) 现在表示 \((a_i,a_{i+1}]\) 的一段,所以 \(f_{i+1,i+1,0/1} \gets 2^{len-1} \times f_{i,j,0/1}\)

但是我们发现本来可以通过暴力消除 \(i<l\) 带来的影响,现在不好维护 \(i \leq l-1\) 这个限制。

不如直接把 \(l-1\) 视作一个点,我们也把他加进去离散化,那么至少的限制是好刻画的。

我们又发现,除了 \(f_{i+1,i+1}\) 这个位置我们会变,其他位置都是从原位置继承,考虑滚动数组直接滚掉。

转移时候我们只关心 \(\sum f_{i,j,0/1}\),直接记录 \(sum\) 就可以了。

而由于我们是有序转移的,我们维护限制时置零的是一段不会缩的前缀,所以可以直接维护一个指针就行。

复杂度 \(O(n \log n)\)Submission #334394268 - Codeforces

CF995F Cowmpany Cowmpensation

一棵以 \(1\) 为根的树,给每个点分配权值 \(v_i \in [1,d]\),要求父亲节点的权值不能小于子节点的权值,求分配方案数 \(\bmod 10^9+7\)

Solution

首先 \(O(n^2d)\) 的 dp 是显然的,设 \(f_{i,j}\) 表示 \(i\) 节点填了 \(j\) 的方案数,转移显然有 \(f_{i,j}=\begin{aligned}\prod_{v \in son_u} \sum_{k=1}^j f_{v,k} \end{aligned}\)

发现关于每个 \(v\) 的贡献始终是一段前缀的形式,维护前缀和 \(g_v\) 可以做到 \(O(nd)\)

观察到 \(f\) 的计算是每个儿子节点的答案乘起来。可以看成多项式的形式。

不难发现,当 \(siz_u=1\) 时,\(f_{u,i}=1\),是 \(0\) 次多项式,\(g_{u,i}=i\),是 \(1\) 次多项式。

然后多项式相乘次数相加,所以 \(f_{u,i}\)\(siz_u-1\) 次多项式,\(g_{u,i}\)\(siz_u\) 次多项式。

我们想知道 \(g_{1,d}\),就只要知道前面 \(n+1\) 个值就好了。因为 \(n+1\) 个值唯一确定一个 \(n\) 次多项式。

\(O(n^2)\) 暴力直接跑出来 \(g_{1,1\sim n+1}\),然后拉格朗日插值做完了。

复杂度 \(O(n^2)\)Submission #334459683 - Codeforces

posted on 2025-08-21 23:48  Syxqwq  阅读(11)  评论(0)    收藏  举报