出锅致歉:时间没选好,12点钟,集训同学只能看哪个班先到教室了(?)
原定 T4,官方放错题目了,原题:https://www.acgo.cn/contest/detail/22010?matchRoundId=22010&examId=90123&openLevel=2&teamCode=1935320303573721088&inviteCode=zZXh
@Sherry 申请改题目改数据
题解会给原题的,记比赛 T4 的分。
赛时播报
开赛 60 分钟内,无 AK。
T1 出现了首个 40 分做法
T1 出现了首个 90 分做法
首 AK 帅树(好像是个老师)
T4 只考虑 i ≠ j 的操作
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
赛后总结
本次比赛共 880880880 人报名,154154154 人提交,100100100 人有分。
AK 人数 222 人。
感谢各位选手参加 CXXP#2。
统计信息未排除作弊者,奖项将在作弊检查后发放,请耐心等待。
题号 难度 通过人数 通过率 A 通过率 B 预期情况 A\text{A}A 省选\color{9C3DCF}{\text省选}省选 222 1.29%1.29\%1.29% 2%2\%2% 远高于预期 B\text{B}B 提高\color{13C2C2}{提高}提高(−)\color{53C41A}{(-)}(−) 252525 16.23%16.23\%16.23% 25%25\%25% 略低于预期 C\text{C}C 普及−\color{F39C11}{普及-}普及− 535353 34.42%34.42\%34.42% 53%53\%53% 低于预期 D\text{D}D
普及\color{FFC116}{普及}普及 393939 25.32%25.32\%25.32% 39%39\%39% 略高于预期 题号 idea 来源 实际出题人 格式修正等 数据来源 题解编写 A\text{A}A Xyl Xyl Xyl & wcqk Xyl Xyl B\text{B}B sk sk & Euc Euc & sk sk sk C\text{C}C wcqk wcqk wcqk wcqk yh24chenyiming D\text{D}D wcqk yhzakioi yhzakioi yhzakioi yhzakioi
通过率 A 为全场有提交通过率
通过率 B 为全场有分通过率
CXXP#2 T1 新版题解
很板子的手速题加卡常题。题面在说啥。
对于第一个子任务,暴力做。
对于第二个子任务,相当于 P3834,套用模板可以通过。
对于第三个子任务,只有最后一个操作是询问。用平衡树之类的数据结构维护插入和删除的元素顺序,最后进行中序遍历并暴力求解最后一个操作的答案。
对于 100%100\%100% 的数据,注意到操作可以用树套树模板求解,但是无法通过本题大部分的空间限制。由于题目要求动态区间查询且不强制在线,不难想到先维护每个元素的最终位置,再对操作的坐标进行对应,之后使用整体二分求解,添加操作对应整体二分添加值操作,删除对应整体二分的删除值操作。见模板题,整体二分的修改就是一个删除值加一个增加值。
关于做法,Asdfre 大佬场切了这道题,ta 的代码函数名设置为了 cdq(),实际上这个做法应该是整体二分。Asdfre 的做法特判了删除的元素,实际上树状数组数点时可以直接跨过没有操作的元素,在使用平衡树时子树大小不统计已删除节点即可。
其他问题代码里写得很清楚了,可以对照代码理解。本题略微卡常。ACGO 评测机会把某些增加了优化的代码跑得比没有优化的代码慢,不知道啥原理,玄学罢。
感谢大和赤骥智力支援卡对题解作者智力的一切支持。
T1 岁月成碑 旧版题解
题意是求带插入/删除元素的区间第 kkk 小值。
10pts Solution
有 1010%10 的数据量很小,暴力模拟即可。时间复杂度 O(MNlogN)O(MNlog N)O(MNlogN)
30pts Solution
当 1≤N,Q≤5001\leq N,Q\leq 5001≤N,Q≤500 时,运行暴力程序。
否则,由于对于另外 2020%20 的数据, opi=1op_i=1opi =1, 因此这部分测试点直接使用主席树/整体二分模板完成即可。
代码在这里不予给出,请查找资料。
50pts Solution
对于以上所述 1≤N,Q≤5001\leq N,Q\leq 5001≤N,Q≤500 和 opi=1op_i=1opi =1 的测试点,使用 30pts 的解法。对于 opi∈2,3op_i\in{2,3}opi ∈2,3, opQ=1op_Q=1opQ =1 的测试点,只有最后一个操作是询问,前面我们只需要维护序列的插入和删除操作。我们可以维护一个有序表,最后进行一次暴力解决最后一个询问。由于维护有序表只需要 O(Nlog2N)O(Nlog_2N)O(Nlog2 N) 的时间复杂度,因此如替罪羊树这样的 BST 应该也可以通过。注意, 如果使用 BST
维护有序表,最后进行一次中序遍历得到最终序列。代码不予给出,请查找资料。
90pts/AC Solution
注意到,对于此问题,在线查询很不可做,考虑离线。如何用树套树解决此问题?
树套树维护的是一个整体序列,不支持插入/删除操作。用一种入门级的方法,只需要将数组将要插入的位置多空开一格,初始设为 INF, 不影响区间第 kkk 小值的计算。我们可以用有序表离线维护每个查询/插入/删除操作的端点位置,当插入新元素时在有序表里插入这个元素位置,当删除元素时只用将它标记为删除,后续二分时忽略这个元素即可。不能真删是因为如果真删那么离线完处理询问时将无法处理包含已删除元素的询问。离线处理完每个操作的下标后如果是 BST 就要进行一次中序遍历,包含已被删除的元素,最后将每个操作的初始位置修改为新位置。由于树套树支持修改操作,在添加时只用把已有的 INF
位置修改为新数,删除时把该位置修改为 INF 即可。
代码不予给出,请对照后面 AC 代码和网上资料改出树套树代码学习。
因为树套树空间复杂度大、常数大,无法通过本题最后一个测试点。考虑整体二分。
由于进行了两次离线,出题人将该技巧称为“整体二分二次离线”或者“整体二分后置二次离线”。理论上该算法可以解决整体二分中操作对全局其它操作有影响的问题,特别是带插入/删除的整体二分经典问题。作者在代码中使用 FHQ-Treap 维护有序表。代码中所有操作的初始位置代表了所操作位置在 FHQ-Treap 中对应的节点编号,插入时开一个新节点,并到 root 根节点的树上,把插入操作的位置设为新节点的编号。删除时查找 BST 上第 xxx 个元素的编号。询问操作同理,将左端点和右端点转化为 FHQ-Treap 上的编号。
完成第一次离线后,中序遍历 FHQ-Treap, 计算出每个节点对应的新位置,最后使用整体二分。整体二分不用初始化 INF, 因为整体二分是一种仅与操作有关的算法,没有给出的操作可以直接忽略, 可以理解为支持回答某些元素空缺的询问。整体二分和 FHQ-Treap 的常数较小,可以通过所有测试点。
由于本题时间限制,给定正解为跳表/FHQ-Treap/Splay + 整体二分,其它算法理论上无法通过。
以下是未优化代码,注意二分查找时不能查找到已删除元素:
以下是已优化代码,可能可读性不如未优化版本。
T2 皓仔的太空人计划 题解
* 难度:绿
* 思路:按题目要求广搜即可
代码:
T3 上帝造题1
第一眼,这个题不会太简单。
但是看了一眼样例,发现全是 YesYesYes 。
所以感觉题目的答案有可能也全是 YesYesYes。
让我们来想想如何实现所有数一样,发现,当我们看 n=1n=1n=1 的时候样例输出了 YesYesYes,
那时候必须 i=ji=ji=j(其实已经全都一样了),显然突破口在这里,当 i=ji=ji=j 的时候 ai=ai+aj=2∗ai,aj=∣ai−aj∣=0a_i = a_i + a_j = 2 * a_i, a_j = |a_i - a_j| = 0ai =ai +aj =2∗ai ,aj =∣ai −aj ∣=0 所以
ai=aj=0a_i = a_j = 0ai =aj =0 只要执行 nnn 次所有数都会变为 000,这样全输出 YesYesYes 就行了。
T4 上帝造题2原题
条件 max>sum\max>\text{sum}max>sum 与区间内去掉最大值后,剩余元素的和为负数其实等价。
枚举每个位置作为区间最大值,向左右扩展到第一个比它大的数为止(这是它作为最大值的最大范围)。
在这个范围内向左或向右累加(不含自身),一旦累加和变成负数,就找到了符合条件的区间。
每个元素最多被访问两次(左扩展一次、右扩展一次),总复杂度 O(n)O(n)O(n)。