Educational Codeforces Round 174 部分题解

VP 完口胡的(逃

D - Palindrome Shuffle

题意

对于一个长度偶数的字符串 \(s\) ,找到 \(s\) 的一个区间并把区间内的字符任意重排,使得 \(s\) 变成回文串。

求出区间长度的最小值,保证存在方案。

题解

先找到最大的 \(l\) 满足 \(s_{1\cdots l}\)\(s_{n-l+1 \cdots n}\) 构成回文串,再找到最小的 \(r\) 满足 \(s_{r \cdots n/2}\)\(s_{n/2+1 \cdots n-r+1}\) 构成回文串。

现在令 \(l=l+1,r=r-1\) ,即为 \(s\) 第一个和最后一个不构成回文的位置。

若区间 \([l,r]\) 和其对称区间的字符集组成相同,则答案为 \(r-l+1\)

否则,我们将区间 \([l,n-l+1]\) 划分成区间 \([l,mid]\)\([mid+1,n-l+1]\),我们断言区间 \([l,mid]\) 可行当且仅当对任意字符,其在区间 \([l,mid]\) 的出现次数均大于等于在 \([mid+1,n-l+1]\) 出现的次数,区间 \([mid+1,n-l+1]\) 同理,于是指针贪心移动就可以。

参考代码

E - A, B, AB and BA

题意

将字符串 \(s\) 划分为若干子串,每个子串都是 \(A,B,AB,BA\),且最终 \(A,B,AB,BA\) 数量不超过 \(s_1,s_2,s_3,s_4\),询问是否可行。

题解

先将 \(s\) 全部划分为 \(A,B\),再考虑移除一些划分位置变成 \(AB,BA\)

\(AA,BB\) 之间的划分不可能移除,那原串就划分成了若干个形如 \(ABAB\cdots AB\) 这种的交替串。若这个串长度是奇数,设长度为 \(m\) ,那我们若合成 \(k\)\(AB\) ,则可以再合成 \(\frac{m+1}{2}-k\)\(BA\),反之同理。可以发现奇数长度的串能做到最优的合成,但对于偶数长度的串,以 \(A\) 开头为例子,在合成 \(k\)\(AB\) 后,我们只能再合成 \(\frac{m}{2}-1-k\)\(BA\),有一个 \(1\) 的亏损。

我们把奇数串的划分总数存起来,优先处理偶数串的划分。例如我们要处理合成 \(AB\) 这个串,考虑所有 \(A\) 开头的偶数串,设长度除以 \(2\) 后分别为 \(a_1,a_2 \cdots a_m\),我们需要选出一些去凑 \(AB\),并把剩余的串去凑 \(BA\),凑 \(BA\) 时每个 \(a_i\) 都有 \(-1\) 的亏损,由于 \(a_i\) 总和固定,我们需要选取尽可能多的 \(a_i\) 去凑 \(AB\),即把 \(a_i\) 从小到大排序,从小到大凑 \(AB\)

参考代码

F - Graph Inclusion

题意

有两张空图 A,B,每一时刻在 A 或 B 图中加入或删除一条无向边。

每一时刻求出最少在 A 中加多少条边,满足 B 图中任意两连通的点 \((u,v)\),在 A 图中也连通。

题解

考虑 \(B\) 中的一条边,在 A 中两点不连通,则需要连通这两个点,即 A 的连通块个数减一,再加上 A 本身连通的几个点,最终图上的连通块个数即为 把 A,B 图的边并起来后的连通块个数

A 中加一条边连通块个数减一,则答案为 A 的连通块个数 减去 AB并集的连通块个数。维护动态图连通性即可。我不会在线的做法,实现采用离线做法。

简要说一下离线动态图连通性:一条边的存在时间构成若干个区间,区间总数是 \(O(n)\) 的(\(n\) 是时间轴长度),我们使用线段树分治维护每个时间节点下哪些边是存在的,并使用可撤销的并查集维护当前存在的边构成的连通性即可。是用线段树分治是为了使得最新加入并查集的边总是最优先被撤销的,这就可以用栈维护撤销并查集。

参考代码

posted @ 2025-02-25 15:52  蒻蒻虫  阅读(145)  评论(0)    收藏  举报