IOI2020国家集训队作业

CF504E Misha and LCP on Tree

树剖,把路径拍下来,成为 \(\log\) 段。

然后通过 \(hash\) 每次比较,我们可以处理掉一段,或者我们可以花费 \(\log\) 的时间得到答案。

所以复杂度是 \(n \log n\)

CF505E Mr. Kitayuta vs. Bamboos

考虑二分答案,得到一个大家都不超过的答案 \(H\)

然后,我们需要统一我们对每个竹子的限制。

所以我们考虑倒序考虑,那么把每个竹子的高度赋为 \(H\),每个竹子每天会先变矮 \(a_i\),我们可以选 \(k\) 次竹子把选择拔高 \(p\) 高度。

我们首先需要保证,每个竹子在任意时刻的高度得是非负数,好处就是我们对每个竹子的限制都是类似的,方便处理。

最后还要保证每个竹子的最后的高度是初始高度,这个限制实际上只限制了我们对这个竹子的操作次数,而对中间结果没有要求,因此只要在保证第一个限制之后,检查是否有足够的操作机会。

对于第一个限制我们可以用堆贪心地每次处理最早寄的竹子就可了。

CF506E Mr. Kitayuta's Gift

神秘的题目。我们首先有一个 \((n + |s|)|s|^2\) 的做法。

于是有了 \(|s|^6 \log n\) 的矩阵加速做法。

我们的转移图是一个 \(DAG\) ,尝试缩一下这些点。

我们先忽略掉全部的边界情况。

第一类点有自环,自环边权为 \(24\),或者转移到另外的点上,有两种情况,可以覆盖 \(s\) 中的一个字符。

第二类点有自环,自环边权为 \(25\),或者转移到另外的点上,有一种情况,可以覆盖 \(s\) 中的两个字符。

影响答案的有路径条数和走自环的情况数。

路径条数可以通过设计 \(dp\) 求出来,但是对于一种方案,他的计数意义下的权值还应该包含走自环的情况数,我们不可能把走自环数一起 \(dp\) 计算。

这显然与且只与我们走第一类点的个数和走第二类点的个数有关,因此我们 \(dp\) 还应该存储走了多少第一类点。

于是,我们的 \(dp\) 变成了 \((n+s) |s|\) 的了(\(f_{i,j}\) 表示我们选了 \(i\) 个第一类点,填了 \(j\) 个字符的方案数),可以矩阵优化处理。

然后就做完了。

CF512D Fox And Travelling

可以分为若干联通块讨论。

背包合并每个连通块答案即可。

对联通块进行类拓扑排序,如果有点剩余,那么可以给分出来的点定根,对有根树进行 \(dp\) ,很容易。

如果没有点剩余,则任意点可以作为根,发现选择 \(k\) 个点的方案会被算 \(n - k\) 次。

简单题。

CF516D Drazil and Morning Exercise

距离一个点的最远距离一定是一个直径的端点。

那么我们以一个直径的中点作为根,则一个点父亲的 \(f\) 值一定小于当前点的。

那么每个询问做树上差分算一下就完了。

CF516E Drazil and His Happy Friends

\(d = \gcd(n , m)\)。则我们可以先把人先分为 \(d\) 组。

如果有一组不存在快乐的人,则不可能让所有人快乐,否则一定可以。

如果 \(d > b + g\),根据鸽巢原理,我们发现一定有集合不存在快乐的人。

所以我们需要处理的 \(d\) 并不大。

注意到,如果 \(i \bmod n\) 号男生让 \(i \bmod m\) 号女生快乐,那么一个轮子过后,\((i+m) \bmod n\) 号男生也可以快乐。

等价于 \(i \bmod n\) 号男生在 \(m\) 时间过后可以让 \((i + m) \bmod n\) 号男生快乐。女生同理。

于是可以对每一个组跑同余最短路。但是总点数的级别依然不可接受。

发现连边上,男生之间形成了大环,女生之间也形成了大环。

我们可以考虑已经快乐的人之间夹的人的个数来统计,然后处理一下细节就做完了。

CF521D Shop

首先确定基本事实:

一操作如果要做则最先做,因此可以理解为二操作。

二操作如果要做则比三操作先做。

二操作如果加上了小的,那么大的也一定被加上了。

因此,二操作可以视作给原数乘上一个数。

综上,所有操作全部被规约成三操作。而且最后要求最大化乘积,因此我们每次选择使得原数变化倍率最大的一个操作去做就好了。

CF521E Cycling City

如果一条边同时属于两个环那我们就赢了。于是在 dfs 树上找以下就做完了。

CF526F Pudding Monsters

一个区间 \([l , r]\) 合法,当且仅当 \(\max(l , r) - \min(l , r) == r - l\)

且对于任意区间满足 \(r - l \le \max(l , r) - \min(l , r)\)

考虑枚举右端点,利用单调栈我们可以维护后缀最大最小值,拍到线段树上,检查是否有合法解。

然后就做完了。

CF526G Spiders Evil Plan

注意到,直径至少有一个端点在我们的联通块上。那么我们以直径的端点为根,做一个类似长链剖分的东西。

然后我们选择前 \(y\) 长的链,如果 \(x\) 被选了那么就做完了。

否则我们尝试去调整,我们肯定要选上 \(x\) 子树内的最长链,然后不断往上连,直到找到一个被覆盖的点。

现在有两种可能,一个是断掉一条最短的路径,然后加上这一条额外的权值,或者说断掉这个被覆盖的点子树下面延伸出去的最短的半条链,然后就做完了。

CF527E Data Center Drama

先把度数是奇数的点配一下对。

然后建一棵 \(dfs\) 树,除了连向父亲的边以外我们都可以随便定向,然后用连向父亲的边调整。

如果最后根节点还是爆炸,那么为给根节点连一个自环就做完了。

因为我们不可能通过调整与根节点有关的反祖边达到目的。因为会产生连锁反应导致一条儿子边反向。

CF536D Tavas in Kansas

设立两个数组,第一个是先手的起点到其他所有点的距离从小到大排序后的结果。

第二个是后手的。

因为每个人选取点的顺序是确定的。

明显可以设置一个 \(dp_{x,y,0/1}\) 表示先手当前走到距离他第 \(x\) 远,后手走到距离他第 \(y\) 远时是先/后手行动的最优权值差是多少。

然后容易转移。

CF538G Berserk Robot

大分类讨论题。

posted @ 2022-09-08 22:48  Reanap  阅读(102)  评论(0编辑  收藏  举报