MX Day4

· · 生活·游记

T1:

做法:

1、我们可以先用单调栈找出每个数的最大值覆盖范围;

2、之后我们可以通过枚举每一个点,以这个点为最大值,枚举l和r,然后对这两个位置的s数组进行异或;

3、用桶数组记录每一种异或结果出现次数

4、最后别忘了要做前缀和,因为我们的序列要求是异或值小于等于x,不是等于x。

关键点:

1、我们要做前缀和,方便O(1)查询区间异或值;

2、我们要保证从当前数到它的l处的距离小于等于后面的剩下段长度,这样我们可以保证枚举长度尽量少。

T2:

做法:

1、首先,我们可以考虑链表的做法,给每一个值挂一个链表,表示这个值在哪里出现过;

2、之后,我们直接操作;

3、如果余数是1,我们就直接用ans对mn异或,得到的结果到时候直接输出;

4、如果余数为2,则进行加数操作;我们首先可以不断遍历表头找出最小的数,之后,我们将这个数和此时随机化得到的结果对比,如果比随机化的结果大,则直接赋值;否则加入链表;

5、如果执行操作三,现将将表头删除,之后就是判断此时的最小数,改变最小数就OK了。