Codeforces Round 867 (Div. 3)

发布时间 2023-05-01 10:54:41作者: 努力的德华

题目链接

E

核心思路

首先我们先考虑什么情况下是肯定不可以交换成功的:

aaabc.比如像这种a的个数超过了我们整个字符串一半的长度就肯定是不可以的。然后剩下的情况肯定都是可以的。

然后考虑怎么样可以使得交换次数最小呢:

aa aa bb cc dd ff。

我们发现这组的话我们只需要交换两次,也就是如果某个字母的对数小于等于其他的对数那么就可以两两交换。如果不是呢,那么就是某个字母出现的最多的对数的次数。比如:

aa aa aa bb cc dd,这样就必须的三次

记得需要向上取整。

F

核心思路

这道题目换根板子题,题目链接

也就是需要我们求出来以某一个点作为端点的最大长度。

但是这个我们发现其实最大长度肯定是这一课树的直径的两端点的距离,所以我们先求出来两个直径,然后跑dfs和bfs都可以,但是需要跑三遍,因为方便我们算代价。

因为树上的路径都是简单路径,也就是但是两个点之间的路径都是唯一确定的。

G

核心思路

这是一个值域分治的好题目。

首先清楚我们的目的:我们需要求这样子的对数:x/b x x*b.然后我们的第一思路肯定是想把我们的x分解质因数,也就是b就是他的一个约数。但是x的范围是\(1e9\).所以直接分解会直接爆炸。但是我们知道的是当x的范围是\(1e6\)的时候是可以直接分解的。

所以我们直接引入值域分治:也就是当\(x<1e6\)的时候,直接分解,\(1e6 \le x \le 1e9\)的时候怎么办呢,这里可以想到我们最大的数是\(x*b\),所以我们直接枚举b,因为这里的x大于\(1e6\),所以b就最多只要到1e3.所以这个时间复杂度完全可以接受。

需要注意的是我们枚举约数的时候是会有两个的,一个是小于等于\(\sqrt{x}\),还有一个是大于的。千万别忘了。