MX Day4
OIer_ACMer · · 生活·游记
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了。