Codeforces Round #769 (Div. 2) 题解

比赛链接

AB

略。

C

有一个很简单的结论,就是最终答案一定是形如 1111....132222....23

由于 \(\sum b\le 10^6\),枚举 12 进行了几次即可。

代码链接:https://codeforces.ml/contest/1632/submission/144524800

D

结论:对于每个 \(r\),满足条件 \(\gcd(a_l,a_{l+1},\dots,a_r)=r-l+1\)\(l\) 最多只有一个。

简单证明一下,就是说如果 \([l,r]\) 满足条件,即它们的 \(\gcd=r-l+1\),那么 \([l-1,r]\) 如果满足条件,它们的 \(\gcd\) 就要等于 \(r-l+2\),添加一个数无论如何都不可能使它们的 \(\gcd\) 变大。因此最多只有一个符合条件。

因为加入一些数 \(\gcd\) 总会变小,因此我们可以二分来找到左端点。

我们把所有满足条件的区间 \([l,r]\) 拿出来,容易发现答案就是选最少的点使得每个区间都至少有一个点。这是一个经典贪心问题,原问题按照右端点排序贪心求解。本题中,我们直接扫一遍即可。

代码链接:https://codeforces.ml/contest/1632/submission/144559778

E1

有一个比较显然的结论:新加的边一定是连接 \(1\) 和另一个点。证明考虑如果把一个端点换成 \(1\) 答案不会变大。

考虑把问题放到最短路树上考虑。问题其实等价于在最短路树上删一条边后加一条边。

加一条边不好处理,于是我们考虑删一条边。

枚举删掉了 \(u\) 和它父亲的连边,那么要使答案最小,一定连接的是 \(1\)\(u\) 子树内直径的中点。此时答案就是 \(\max(x+\lceil\frac{\text{diameter}}{2}\rceil,exdep_u)\),其中 \(exdep_u\)\(1\)\(u\) 子树外的点的最大距离,可以用 dfs 序 + ST 表求出。

直接计算即可。

注意子树直径要和所有子节点的子树直径取 \(\max\)

代码链接:https://codeforces.ml/contest/1632/submission/144580152

E2

观察每个节点答案的表示方式,设 \(\Delta=exdep_u-\lceil\frac{\text{diameter}}{2}\rceil\),那么当 \(x\le\Delta\) 时,二者最大值是 \(exdep_u\);当 \(x>\Delta\) 时,二者最大值就是 \(x+\lceil\frac{\text{diameter}}{2}\rceil\)

发现贡献是一个区间,开两棵线段树即可。

注意清空问题。

智商不够,数据结构来凑。

代码链接:https://codeforces.ml/contest/1632/submission/144628712

启发

Div.2 比 Div.1 好上分多了(雾

posted @ 2022-02-02 16:13  csxsi  阅读(83)  评论(0编辑  收藏  举报