1 条题解
-
0
题解:密码特征值与X位置的映射
问题转化
已知个位置排成环,其中个位置是A(集合),个位置是B,1个位置是X。
定义:从X顺时针出发,到某个A时,若途中A的个数严格大于B的个数,则称该A为“强的”。特征值=强的A的个数。
给定A的位置(即集合),有种放置X的位置(对应个空位),特征值恰好取遍。
需要根据特征值反推X的位置。
关键概念
1. 序列表示
将环从X断开,按顺时针展开为长度为的序列(不含X)。
令A对应,B对应,得到一个长度为的序列,其中有个,有个。2. 前缀和与强的A
设前缀和。
从X出发顺时针到第个A(按遇到顺序)时,设该A在序列中的位置为,则途中A的个数严格多于B的个数 ⇔ 到达该A时的前缀和。
因此,强的A的个数就是所有A位置中满足的个数。
3. 不同断点对应不同特征值
当X的位置移动时,序列循环移位。设原序列(固定某个参考X)为,前缀和为。
若X顺时针移动步(即原序列向右循环移位),则新序列为。
新前缀和(对)或(对)。
但注意(因为和数量相等),所以(模下标,且)。
因此,新序列中位置的符号为时,条件是。
4. 转化为找第S大的断点
问题变为:给定,求一个偏移(,且对应一个B或A的位置?实际上对应原X后的位置索引),使得满足的个数(其中)等于。
由于取个特定值(对应X在某个非A位置?不,X可以在任何位置,但给定A的位置时,X只能放在非A位置,有个空位)。
实际上,对应X在原序列中的“前一个位置”索引。设原序列对应某个参考X(比如放在位置1之前)。则X实际在位置之前()对应偏移(模),但需保证不是A的位置(因为X不能与A重叠)。
5. 特征值0对应X的位置
特征值0表示没有强的A,即对所有A位置,。
由于是整数且变化量为±1,这等价于对所有A位置成立。
这要求是在所有A位置索引上的最大值?不,是?但可能重复。
实际上,令,需要?但若且某个A位置满足,则差为0,不满足严格大于0,所以该A不强。因此特征值0的条件是:,且取等时该A不算强。
但更精确地:对所有A位置,。
由于序列循环,可重新标号使X在位置0(即偏移),那么对所有A位置成立。
因此问题转化为:找到一个循环移位,使得所有A位置的前缀和。
6. 已知结论
由题目结论,特征值与X的位置一一对应,且特征值等于“从X顺时针出发,第一次遇到前缀和达到某个值的次数”等。
实际上,若将值看作高度,从X出发(高度为),顺时针走,遇到A时检查当前高度是否大于出发高度。强的A的个数就是高度严格大于出发高度的A的个数。
因此,将所有位置按值排序,特征值对应选择第高的出发高度?但需考虑A的位置。
7. 特征值S的X位置
更系统的方法: 定义数组,,,其中如果位置是A,否则。
环上位置从1到,X放在位置()时,对应断点在(模),即偏移。
设(出发高度)。
强的A的个数 = #{ | }(在循环意义下,是位置的前缀和,注意索引可能大于需调整)。
因为循环移位后,位置的新前缀和为(若)或(因为)。所以确实就是的A的个数。
因此,特征值对应选择使得恰好有个A位置满足。
8. 具体算法
预处理:
- 给定A的位置集合(大小为)。
- 构造序列,对应位置为A(+1)或B(-1),位置留给X?注意环上共个位置,但我们构造序列时先固定X在位置,则序列对应位置的值。
- 计算前缀和,,。
- 记录所有A位置(在中)的值,记为集合。
- 对排序。
对于特征值: 我们需要使得#{ } = 。 由于从0到,应取中第大的值?不,#{ } = ⇒ 有个大于,个小于等于。所以是中第小的值?不,若等于某个值,则相等的不算大于,所以应介于中第大和第大之间?但必须是某个值()。
实际上,,是某个位置索引(0..2k)。我们需要#{ } = 。
因此,对每个(0..2k),计算 #{ }。 则取遍0..k,且一一对应。
我们需要:
- 特征值0: ⇒ 。
- 特征值S: ⇒ 是使得恰好个大于它的值。
因此,将所有()排序,并与比较,即可得到每个。
9. 位置映射
对应X在位置(若)或位置(若?注意范围0..2k-1对应位置1..2k,对应位置?但,且位置是X)。
但注意:是序列索引(0..2k-1)对应位置是X?不,若是前缀和索引,则对应在位置之后放X(即X在位置,环上模)。
更准确:设位置1..2k+1,序列对应位置1..2k,位置是X(参考)。那么对应位置(i=1..2k)的前缀和。X放在位置时,相当于将环旋转使成为新起点,则新序列的前缀和是原减去(模意义)。因此(若,则)。
因此,,(对应)。
10. 答案计算步骤
-
给定A的位置集合(大小为)。
-
构造数组:对,若则,否则。
-
计算:,()。
-
收集所有()到数组,排序。
-
对,计算 #{ }。
- 可通过排序所有并与比较得到。
-
建立映射(若)或(若)。
- 注意:不能是A的位置,需检查。但对应肯定不在(因为)。对于,若,则这个不可行(因为X不能放在A上)。所以实际上只能取且。
- 因此需要过滤:满足(且)。
- 时自动满足。
-
对于特征值S:
- 第一问:,找且的。
- 第二问:,找且的。
- 第三问:给定B的位置(即是B的位置),则A的位置是补集。同样计算,只需将符号取反?不,只需将改为A位置的值(A位置是的补集)。
11. 时间复杂度
- 构造:
- 排序:
- 映射: 总复杂度,可过(需注意内存和常数)。
12. 具体实现
- 用数组存储和位置信息。
- 用计数排序或快速排序。
- 注意很大,避免递归爆栈。
13. 第三问转换
给定B的位置集合(大小),则A的位置是补集。 算法同上,只需将改为的值集合。
14. 最终输出
对每个询问,输出对应的即可。
- 1
信息
- ID
- 6074
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者