#P17398. [ICPC 2018 Shenyang R] Best ACMer Solves the Hardest Problem
[ICPC 2018 Shenyang R] Best ACMer Solves the Hardest Problem
题目描述
终有一天,优秀的 ACMer 会离开赛场去迎接新的挑战,正如前辈们所做的那样。他们中的一些人接管了家族生意,一些人则挣扎在失业的边缘。有些人鼓起勇气展示自我,成为了一名职业 Ingress 玩家,还有些人仍在不断挑战极限,试图解决 Project Euler 中的所有问题。
但对前国王 Benecol de Cecco 而言,所有这些归宿都太过肤浅。他现在所做的是成为 StackOverflow 上最优秀的回答者。StackOverflow 是最大、最受信赖的开发者在线社区,供他们学习、分享编程知识并建立职业生涯。
今天,他注意到一个由 Kevin Li 提出的问题:最近,我实现了一个实验,需要找出与查询点 欧几里得距离均为同一个值 的所有数据记录。我尝试使用 k-d 树来提高搜索效率,但发现 k-d 树需要遍历所有叶节点才能返回结果,也就是说,它仍然需要比较所有数据才能得到结果。
这个问题可以被形式化为构建一个支持实时查询和修改的数据库。初始时,假设平面上有 个不同的点。第 个点位于 ,并具有权重 。然后我们考虑若干动态给出的查询和修改,以如下形式表示:
- :在 处插入一个权重为 的新点,保证在此操作前该位置没有点;
- :删除位于 的点,保证此操作前该点存在;
- :对于每个与 的欧几里得距离为 的点,将其权重增加 ;
- :查询所有与 的欧几里得距离为 的点的权重之和。
Benecol de Cecco 表示这个问题非常简单,并让我与大家分享这个问题。顺便一提,两点 与 之间的欧几里得距离等于 。
输入格式
输入包含多组测试数据,第一行包含一个正整数 ,表示测试数据的组数,最多为 。
对于每组测试数据,第一行包含两个整数 和 ,分别表示平面中初始的点的数量以及操作的数量,满足 。
接下来的 行,每行包含三个整数 ,满足 ,描述了初始时位于 且权重为 的一个点。
接下来的 行,每行包含一个操作,可以是查询或修改,以如上所述的形式给出。为使操作中的 和 均为动态值,我们使用 表示最近一次查询的答案,其初始值为 。对于输入中每个拥有值 和 的操作,它们的真实值应分别为 和 。所有操作中的系数均为整数,且满足 ,。
我们保证所有测试数据中 的总和以及 的总和各自不超过 。
输出格式
对于每组测试数据,首先输出一行 “Case #x:”(不含引号),其中 是测试数据的编号,从 开始。
然后对于每个查询,在一行中输出一个整数表示答案。
1
3 6
2999 3000 1
3001 3000 1
3000 2999 1
1 2999 3000 1
4 2999 2999 1
2 2995 2996
3 2995 2995 1 1
4 2995 2995 1
4 3000 3000 1
Case #1:
4
6
0
提示
在样例中,如果我们忽略操作中 和 动态调整的特殊输入格式,我们可以以离线形式直接展示这些修改与查询如下:
- ;
- ;
- ;
- ;
- ;
- 。
翻译由 DeepSeek V4 Pro 完成