XCPC 训练笔记

博主感觉实在水平不行,写点东西记录一下 XCPC 训练。

Xor Mirror

支持将 \([l,r]\) 区间赋值为区间 \([l,r]\bigoplus k\) 的值,查询区间和。

\(n=2^k,k\le 18\)。

Solution

sol 是根号,然而可以单 \(\log\)。
考虑显然有可持久化 Trie/线段树的一个做法,维护一些 rev 标记就行了。
比较难处理的问题是空间 \(O(n\log n)\) 被卡掉了,考虑由于我们只需要知道当前版本的信息,一个想法是写空间回收,比较痛苦。
一个更好的想法是每 \(\dfrac n {\log n}\) 次操作后重构一次整棵树,时间复杂度 \(O(n\log n)\),空间 \(O(n)\)。
实现得比较烂:
code

海鸥奇遇

网络中有 \(n\) 只海鸥和 \(n\) 份食物。在一步指挥中可以让一只海鸥往上、下、左、右中的一个方向飞到最近的没有海鸥的格子。当海鸥飞到了有食物的格子时会吃掉食物并且飞离网格。
请您执行恰好 \(n\) 步指挥使得所有海鸥吃掉食物飞离网格,或者报告无解。

\(n\le 5000\)。

Solution

考虑先跑一个二分图匹配,没有完美匹配显然无解。
跑出来匹配之后考虑执行顺序建一个有向图。
如果有向图有环的冲突我们试图处理:
一个简单的想法是对于 \(a_0\to a_1\to a_2\to \cdots\to a_{c-1}\to a_0\) 的环,我们可以让 \(a_i\) 海鸥去匹配 \(a_{i-1}\) 海鸥原本匹配的食物。
如果定义每一个匹配的距离之和为势能,我们思考这样的调整一定只会让势能减小。
初始势能 \(O(n^2)\),所以可以分析出调整最多执行次数。

另一个做法是由于我们的调整只会是势能变小,我们试图直接一步求出势能最小的匹配。
边集很稀疏,可以跑最小费用最大流就行了,而非 KM。

延展 宁哥提到了另一个题:

平面上 \(n\) 个红点 \(n\) 个蓝点,求一个方案使得他们两两匹配且线段连接后互不相交。

由平面几何的知识可以证明对于一组相交的线段,把匹配调整之后线段长之和显然变小。
同样延续上述的分析,因为边很满,我们跑 KM 是 \(O(n^3)\)。

posted @ 2026-03-22 11:27  juju527  阅读(50)  评论(0)    收藏  举报