解题思路
放置时只关心每个堆最上面的猫猫虫大小。设数组 top 表示每个堆的堆顶大小。
由于每次选择的是第一个堆顶大小 > 当前大小 x 的堆,因此 top 始终是非递减的:
- 若找到某个位置 pos,则把 top[pos] 改成 x;
- 若找不到,说明所有堆顶都 ≤x,就在末尾新建一个堆。
P4957.第1题-猫猫虫堆的异或和
题目内容
猫猫虫们喜欢在别人的身上睡觉。从左到右有无限多个可以堆猫猫虫的位置(我们称为"堆")。接下来会依次走来 n 只猫猫虫,第 i 只猫猫虫的大小为 ai。放置规则如下:
- 从第一个堆开始向右依次检查;
- 如果当前堆为空,或者该堆最上面的猫猫虫大小 > 当前猫猫虫大小,则把当前猫猫虫放到这个堆的最上面;否则继续检查下一个堆;
- 如果一路检查到某个空堆,那么就在该空堆新建一个堆并把当前猫猫虫放上去。
在每次放置完一只猫猫虫后,记每个堆的高度(即堆中猫猫虫的只数),请你输出当前所有堆的高度的异或和(即所有高度按位异或的结果)。
输入描述
每个测试文件均包含多组测试数据。第一行输入一个整数 T (1≤T≤2×105) 表示数据组数,每组测试数据描述如下:
- 第一行输入一个整数 n (1≤n≤4×105) 表示猫猫虫的数量。
- 第二行输入 n 个整数 a1,a2,…,an (1≤ai≤109) 表示每只猫猫虫的大小。
除此之外,保证单个测试文件的 n 之和不超过 4×105。
输出描述
对于每一组测试数据,新起一行。输出 n 个整数(以空格隔开),其中第 i 个数表示放置完前 i 只猫猫虫后,所有堆的高度的异或和。
样例1
输入
2
5
3 3 2 2 1
4
1 2 3 4
输出
1 0 3 0 1
1 0 1 0
说明
- 对于第一组数据 n=5,a={3,3,2,2,1},每次放置后的堆高度序列依次可能为 {1}、{1,1}、{2,1}、{2,2}、{3,2},对应的异或和依次为 1、0、3、0、1,与输出一致。
- 对于第二组数据 a={1,2,3,4},每次都会新建一个堆,堆高度序列依次为 {1}、{1,1}、{1,1,1}、{1,1,1,1},异或和依次为 1、0、1、0。