OneKuma

OneKuma's Blog

One Lonely Kuma.
github
bilibili
twitter

European Championship 2024 题解

European Championship 2024 - Online Mirror

image

A. Grove#

给你一个 20×2020 \times 20 的方格,往里面的整点上尽可能放半径为 rr 的圆(rr 是个三位小数),最多放几个。

看过一些密铺问题的结论,感觉排列方法似乎没啥道理可讲。

大概感觉是个怎么记忆化 + 启发式 + 爆搜的题。显然应该尽可能的放近的,记忆化去除一些重复的搜索。因为没有队友写,瞎几把口胡的好像完全没啥能过的道理啊?

B. Charming Meals#

队友写了一题就走了。

C. Annual Ants' Gathering#

给你一棵树,每个点上有一个蚂蚁,每次你可以让点 uu 上的所有蚂蚁沿着一条边走到 vv,满足 uu 上的蚂蚁数量小于等于 vv 上的数量。问最后能不能把所有蚂蚁集中到一个电上。

显然,你把一个点留空了,那这棵树就断掉了,所以你每次只能缩一个叶子。并且由于小的点才更有可能缩,小点缩完才会产生大点让其它东西有机会走。

所以,大概维护小顶堆,模拟一个拓扑排序的东西,就行了。

F. Dating#

给你 nn 个人,每个人有一个集合。定义好匹配是,两个人的集合有交,但是不互相包含。找一个好匹配,或者报告没有。

胡编乱造了一个做法,基于这个集合大小的种类数是根号量级的(600 种)。

首先,对于每种集合大小,看下这里面是否重复的完全相同集合,去掉(使用无序集合哈希)。然后,看一下有没有两人的集合有交,也就是看看有没数字重复出现,有的话就有交,又因为长度相同而且不是完全相同,所以就是答案。

于是,我们现在得到了 600 种长度,每个长度里有一堆不相交的集合。

然后,从大到小枚举长度,构建一个包含集合关系的森林,然后维护每种树最后一次被哪个节点覆盖。

对于当前长度中的每一个集合,遍历集合拿出每个数最后一次被覆盖的节点是哪个,对于这个覆盖节点集合,有几种情况:

  1. 存在两个点在森林里的两棵树上,那么我们找到了一组答案,当前集合和两个点中任意其一:因为,找到了点说明有交,在不同的树上说明当前集合中的数必定不在另一个里面,又由于长度限制当前集合必定不包含之间所有集合。
  2. 存在两个点在森林里的同一棵树上,那么由于包含关系,这两者一定有祖先关系,选择当前集合和最深的那个作为答案:因为,找到了点说明有交,能找到两种最后覆盖的点上说明这个数在祖先集合里,而不再子孙集合里,又由于长度限制当前集合必定不包含之间所有集合。
  3. 存在一个点在森林里的同一棵树上,那么连一条边,找到了父子关系。

G. Scooter#

没有队友愿意写。

感觉大概对着题意构造下就行了,比如 -m mc cm mc c- -c cm m- -c cm m- 这样弄弄。

I. Disks#

给你一堆可能相切可能相离的圆,问你是否可能通过调整所有圆的半径,使得原本的相切相离关系不变,且所有圆的半径和变小。

大概观察一下可以发现,因为你要保持相切关系,所以你缩一个圆,必然带来另外一个圆变大,两者抵消。

然后在观察一下样例给了个长度为 3 的链,可以弄成一个 "小 - 大 - 小" 的样子,就会减小半径和了。然后考虑复杂的图会怎么样,比如有环,偶环可以,但是奇环不行,自然联想到二分图。因此大概就是对原图二分图染色,相当于减小和加大两种变化,看一下有没有连通块左右两部点数不同。

J. Amanda the Amoeba#

没有队友愿意写。

就感觉枚举目标方格中的每个点,然后删除一些边界上的、没放好的点,一步一步地走过去。

代码#

C. Annual Ants' Gathering#

F. Dating#

I. Disks#

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。